0

MVCサイト用のプラグインを作成中に、コントローラの解像度に関する問題に直面しています。@ Html.Action and Controllers with same name

  • Plugin.Controllers.ProductController(管理者1から継承):全体溶液中の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の「インデックス」アクション)私は、次のコードを持っています。 [HttpException(0x80004005が)

:パブリックアクションメソッド「HomepageProductsが」コントローラ」Plugin.Controllersに見つかりませんでした

MVCではなく公衆一方のプラグイン・コントローラを探し、次の例外をスロー.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 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 は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。サーバーエクステンション。ExecuteInternal(IHTTPハンドラハンドラ、たTextWriterライター、ブールpreserveForm、ブールsetPreviousPage、VirtualPathパス、VirtualPath filePathに、文字列physPath、例外エラー、文字列queryStringOverride)1436

[HttpException(0x80004005が):Erreur D'実行・デ・ラ・demandeランファンを注ぎます(System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper ')。 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 ecute(IHttpHandlerハンドラー、TextWriterライター、ブールpreserveForm)+29 System.Web.HttpServerUtilityWrapper.Execute(IHttpHandlerハンドラー、TextWriterライター、ブールpreserveForm)+24 System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper、String +464 System.Web.Mvc.Html.ChildActionExtensions.Action(HtmlHelper htmlHelper、String actionName、String controllerName、RouteValueDictionary routeValues)+83 System.Web.Mvc.Html.ChildActionExtensionsこのトピックについてのご意見・ご感想をEメールにてお寄せください(日本語と英語に対応しています)。 .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エリアを無視して、プラグインをロードしよう:

UPDATE 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

は、私が何かを逃したが、私は管理者1から上書きした各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" } 
) 

//... 

すべて正常に動作します。これでコントローラを導き出すことができます。