0

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 '.]

+0

컨트롤러에서'Plugin.Controllers.ProductController' ..'View'를 반환하는'HomepageProducts'라는 이름의'ActionResult' 메소드가 있습니까? –

+0

아니요. 공개 된 사람 만이 작업을 수행합니다. –

+0

Route.config에서 'Route 1'에 대한 것이기 때문에 이런 일이 일어나고 있다고 가정합니다. @Html.Action ("HomepageProducts", "Product")는 'Route 1'에서 제공 한 URL과 일치하는 'Product' Controller로갑니다. –

답변

0

나는 내가 뭔가를 그리워하지만 난 관리 하나를 오버라이드 (override) 한 각 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" } 
) 

//... 

현재 모두 정상적으로 작동합니다. 이것으로 컨트롤러를 도출 할 수 있습니다.