0

При создании плагина для сайта MVC у меня возникла проблема с разрешением контроллера.@ Html.Action и контроллеры с таким же именем

Здесь все маршруты, которые касаются текущего контекста:

routes.MapRoute("Route1", 
    "Admin/Product/{action}/{id}", 
    new { controller = "Product", action = "Index", area = "Admin", id = UrlParameter.Optional }, 
    new[] { "Plugin.Controllers" } 
) 

routes.MapRoute(
    "Admin_default", 
    "Admin/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", area = "Admin", id = "" }, 
    new[] { "Admin.Controllers" } 
); 

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new[] { "Public.Controllers" } 
); 

Есть 3 ProductController классов в целом решение:

  • Plugin.Controllers.ProductController (наследуется от администратора одного)
  • Admin.Controllers.ProductController
  • Public.Controllers.ProductController

На мой взгляд, «/Views/Home/Index.cshtml» (т. «индекс» действие HomeController без какой-либо области) У меня есть следующий код:

@Html.Action("HomepageProducts", "Product") 

Это относится к действию «HomepageProducts» из Public.Controllers .ProductController.

MVC выглядит для контроллера плагин вместо одного публичного и бросает следующее исключение:

[HttpException (0x80004005): публичный метод действия «HomepageProducts» не найден на контроллере 'Plugin.Controllers .ProductController.] System.Web.Mvc.Controller.HandleUnknownAction (String ActionName) +291 System.Web.Mvc.Controller.b__1d (IAsyncResult AsyncResult, ExecuteCoreState innerState) +31 System.Web.Mvc.Async. WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +29 System.Web.Mvc.Async.WrappedAsyncResultBase 1.End() +49 System.Web.Mvc.Cont roller.EndExecuteCore (IAsyncResult AsyncResult): +36 System.Web.Mvc.Controller.b__15 (IAsyncResult AsyncResult, контроллер Контроллер) +12 System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +22 System.Web.Mvc.Async.WrappedAsyncResultBase 1.End(): +49 System.Web .Mvc.Controller.EndExecute (IAsyncResult asyncResult) +26 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute (IAsyncResult asyncResult) +10 System.Web.Mvc.MvcHandler.b__5 (IAsyncResult AsyncResult, ProcessRequestState innerState) +21 System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +29 System.Web.Mvc.Async.WrappedAsyncResultBase 1.End(): +49 System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult AsyncResult) +28 System.Web.Mvc.MvcHandler. System.Web.IHttpAsyncHandler.EndProcessRequest (результат IAsyncResult) + 9 System.Web.Mvc. <> c__DisplayClassa.b__9() +22 System.Web.Mvc. <> c__DisplayClass4.b__3() +10 System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap (Func`1 FUNC) +27

[HttpException (0x80004005): Выполнение запроса ребенка не удалось. Для получения дополнительной информации ознакомьтесь с InnerException.] System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap (Func`1 func) +102 System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap (действие) +64 System.Web.Mvc. ServerExecuteHttpHandlerAsyncWrapper.EndProcessRequest (результат IAsyncResult) +71 System.Web.HttpServerUtility.ExecuteInternal (IHttpHandler обработчик, TextWriter писатель, Boolean preserveForm, Boolean setPreviousPage, VirtualPath путь, VirtualPath Filepath, String physPath, ошибка Exception, String queryStringOverride) +1436

[HttpException (0x80004005): ERREUR d'Execution де ла Demande Enfant налить le gestionnaire 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'.] System.Web.HttpServerUtility.ExecuteInternal (обработчик IHttpHandler, writerWriter, Boolean preserveForm, Boolean setPreviousPage, путь VirtualPath, VirtualPath filePath, String physPath, ошибка исключения, строка запросаStringOverride) +3428452 System.Web.HttpServerUtility.Execute (обработчик IHttpHandler, писатель TextWriter, Boolean preserveForm, Boolean setPreviousPage) +76 System.Web.HttpServerUtility.Ex ecute (IHttpHandler обработчик, TextWriter писатель, Boolean preserveForm) (обработчик IHttpHandler, TextWriter писатель, Boolean preserveForm) +29 System.Web.HttpServerUtilityWrapper.Execute +24 System.Web.Mvc.Html.ChildActionExtensions.ActionHelper (HtmlHelper HtmlHelper, String ActionName, String controllerName, RouteValueDictionary routeValues, TextWriter TextWriter) +464 System.Web.Mvc.Html.ChildActionExtensions.Action (HtmlHelper HtmlHelper, String ActionName, String controllerName, RouteValueDictionary routeValues) +83 System.Web.Mvc.Html.ChildActionExtensions .action (HtmlHelper HtmlHelper, String ActionName, String controllerName) +10 ASP._Page_Views_Home_Index_cshtml.Execute() в C: \ Путь \ К \ My \ Project \ Views \ Home \ Index.cshtml: 14

Если это помогает, решение использует Autofac.MVC5 ... Любая помощь/комментарий/идея приветствуются.

Я пропустил что-то или только маршруты подразумеваются в разрешении контроллеров?

UPDATE

При просмотре области «Администратор» все действия выполняются хорошо, плагин и контроллеры администратора работает отлично.

Если я прокомментирую маршрут плагина, ошибка больше не будет выбрана. Конечно, мой контроллер плагинов больше не вызывается.

// routes.MapRoute("Route1", 
//  "Admin/Product/{action}/{id}", 
//  new { controller = "Product", action = "Index", area = "Admin", id = UrlParameter.Optional }, 
//  new[] { "Plugin.Controllers" } 
//) 

Так что я предполагаю, что проблема связана с плагином маршрута, сам контроллер плагин или пути маршрут решена с помощью MVC?

UPDATE 2

Я пытался раскомментировать все мои маршруты и указать область в @ Html.Action() следующим образом:

@Html.Action("HomepageProducts", "Product", new { area = "" }) 

Но MVC игнорировать область и попытаться загрузить плагин контроллер ...

[HttpException (0x80004005): публичный метод действия 'HomepageProducts' не был найден на контроллере "Plugin.Controllers .ProductController.]

+0

В вашем контроллере 'Plugin.Controllers.ProductController' .. у вас есть метод' ActionResult' с именем 'HomeProducts', который возвращает' View'? –

+0

Нет, я этого не делаю. Только публичное имеет это действие –

+0

Я бы предположил, что это происходит потому, что в вашем Route.config, в частности, для 'Route 1' .. вы вызываете' @ Html.Action («HomepageProducts», «Product»), который перейдя в 'Product' Controller, который соответствует URL-адресу, указанному в' Route 1'. –

ответ

0

Я определенно уверен, что я что-то пропустил, но я обойти мою проблему путем регистрации каждого маршрута действий Plugin.ProductController Я переопределен от администратора одного.

routes.MapRoute("Route1", 
    "Admin/Product/{action}/{id}", 
    new { controller = "Product", action = "Index", area = "Admin", id = UrlParameter.Optional }, 
    new[] { "Plugin.Controllers" } 
) 

//...becomes... 

routes.MapRoute("Product.Action1", 
    "Admin/Product/Action1/{id}", 
    new { controller = "Product", action = "Action1", area = "Admin", id = UrlParameter.Optional }, 
    new[] { "Plugin.Controllers" } 
) 

routes.MapRoute("Product.Action2", 
    "Admin/Product/Action2/{id}", 
    new { controller = "Product", action = "Action2", area = "Admin", id = UrlParameter.Optional }, 
    new[] { "Plugin.Controllers" } 
) 

//... 

Все работает отлично. При этом я могу получить контроллеры.