MVC 사이트 용 플러그인을 만드는 중 컨트롤러 해상도에 관한 문제가 있습니다.@ Html.Action and Controllers with same name
- Plugin.Controllers.ProductController (관리자 하나에서 상속) : 전체 솔루션의 3 개 ProductController 클래스가 있습니다
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" } );
: 여기
는 현재의 상황을 염려하는 모든 경로입니다
- Admin.Controllers.ProductController
- Public.Controllers.ProductController
내 의견으로는 "/Views/Home/Index.cshtml"(즉,
@Html.Action("HomepageProducts", "Product")
그것은 Public.Controllers .ProductController의 작용 "HomepageProducts"을 의미한다 : 어떤 영역없이 HomeController의 "인덱스"작업)을 나는 다음과 같은 코드가 있습니다.
MVC 대신 공개 한 플러그인 컨트롤러 보이는 다음과 같은 예외가 발생 :
[HttpException (0X80004005) : 공용 동작 방법 'HomepageProducts'는 제어기에서 찾을 수 없습니다 "Plugin.Controllers을 .ProductController '.] System.Web.Mvc.Controller.HandleUnknownAction (문자열 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 는1.CallEndDelegate(IAsyncResult asyncResult) +22 System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()를 +49 System.Web System.Web.Mvc.Async.WrappedAsyncVoid .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 는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.Mvc.Async.WrappedAsyncVoid. System.Web.IHttpAsyncHandler.EndProcessRequest (IAsyncResult result) + 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 result) +71 System.Web.HttpServerUtility.ExecuteInternal (을 IHttpHandler 핸들러, TextWriter에서 작가, 부울 preserveForm, 부울 setPreviousPage, VirtualPath 경로, VirtualPath적인 filePath, 문자열 physPath, 예외 오류, 문자열 queryStringOverride) 1436
[HttpException (0X80004005) : Erreur 디부 실행 드 라 demande 앙팡이 부어System.Web.HttpServerUtility.ExecuteInternal (IHttpHandler 처리기, TextWriter 작성기, 부울 preserveForm, 부울 setPreviousPage, VirtualPath 경로, VirtualPath filePath, 문자열 physPath, 예외 오류, 문자열 queryStringOverride) +3428452 System.Web.HttpServerUtility.Execute (IHttpHandler 처리기, TextWriter 작성기, 부울 preserveForm, 부울 setPreviousPage) +76 System.Web.HttpServerUtility.Ex +24 System.Web.HttpServerUtilityWrapper.Execute (IHttpHandler 처리기, TextWriter 작성기, 부울 preserveForm) +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 c : \ Path \ To \ My \ Project \ Views \ Home \ Index.cshtml의 ASP._Page_Views_Home_Index_cshtml.Execute() : 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에 의해 해결되는 방식에 의한 것 같다?
@Html.Action("HomepageProducts", "Product", new { area = "" })
그러나 MVC 영역을 무시하고 플러그인을로드하려고 :
업데이트 2
나는 내 모든 경로의 주석을 해제하고 다음과 같이) (@ Html.Action에서 영역을 지정하려 제어기 ...
[HttpException (0X80004005) : 공용 동작 방법 'HomepageProducts가'컨트롤러 찾지 못한 Plugin.Controllers .ProductController '.]
컨트롤러에서'Plugin.Controllers.ProductController' ..'View'를 반환하는'HomepageProducts'라는 이름의'ActionResult' 메소드가 있습니까? –
아니요. 공개 된 사람 만이 작업을 수행합니다. –
Route.config에서 'Route 1'에 대한 것이기 때문에 이런 일이 일어나고 있다고 가정합니다. @Html.Action ("HomepageProducts", "Product")는 'Route 1'에서 제공 한 URL과 일치하는 'Product' Controller로갑니다. –