web-dev-qa-db-ja.com

私のプロジェクトで同じ名前の複数のコントローラーに問題がある

ASP.NET MVC 3プロジェクトで次のエラーが発生しています。

「Home」という名前のコントローラーに一致する複数のタイプが見つかりました。これは、このリクエストを処理するルート( 'Home/{action}/{id}')がリクエストに一致するコントローラーを検索するための名前空間を指定しない場合に発生する可能性があります。この場合、「namespaces」パラメーターを受け取る「MapRoute」メソッドのオーバーロードを呼び出して、このルートを登録します。

「ホーム」の要求により、一致する次のコントローラーが見つかりました:MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

クラス名がMyCompany.MyProject.WebMvc.Controllers.HomeControllerのHomeControllerがデフォルトのコントローラーフォルダーにあります。

Global.asaxのRegisterRoutesメソッドは次のようになります。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

次に、Companyというエリアがあり、そのエリアのデフォルトのコントローラーフォルダーにHomeControllerがあり、クラス名はMyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerです。

CompanyAreaRegistrationファイルのRegisterAreaメソッドは次のようになります。

   public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Company_default",
            "Company/{controller}/{action}/{id}",
            new { area = "Company", action = "Index", id = UrlParameter.Optional }
        );
    }

これはすべて、この投稿の冒頭で強調したエラーの原因となっています。 NO LUCKを使用して、他のさまざまな投稿から解決策をまとめようと努力しています。

HomeControllerをデフォルトのコントローラーフォルダーに配置し、次に各エリアに配置することはできますか?もしそうなら、これを機能させるために設定ファイルを変更する必要がありますか?

どんな助けでも大歓迎です!

94
mattruma

エラーメッセージには、推奨される解決策が含まれています。「この場合、「namespaces」パラメーターを取る「MapRoute」メソッドのオーバーロードを呼び出して、このルートを登録します。」

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

これにより、 http:// server / がHomeControllerのIndexアクションに移動します。 http:// server/company/home は、エリア登録で定義されているCompanyエリアのHomeControllerのIndexアクションに移動します。

164
David Ruttka

これは、asp.net mvc4アプローチです。

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );
29
cooloverride

名前空間の名前を変更したので、私はdelete de folder binおよびobjおよびrebuildのみ、再び動作します。

10
Reynaldo

これを使って

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "ProjectName.Controllers" }
        );
2
cracker
2
T Gupta

RazorGeneratorを使用している場合、namespacesパラメーターを通知するだけでは十分ではありません。

Global.asax.cs

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        ControllerBuilder.Current.DefaultNamespaces.Add("MyProject.Controllers"); // This one
    }

プロジェクトの名前のみを使用します。

Public Class RouteConfig
    Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute( _
            name:="Default", _
            url:="{controller}/{action}/{id}", _
            defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
           , namespaces:={"MvcAreas"})  
    End Sub
1
glownet

Chris Moschiniが言及しているように、異なるネームスペースを持つ同じコントローラー名を持つ2つのエリアがあり、デフォルトのエリアなしルートが500サーバーエラーを返す場合、ネームスペースパラメーターは十分ではないかもしれません。

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

デフォルトのルートハンドラをオーバーライドして次の行を追加するのが「ベスト」です。

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;
0
XzaR

同じルートを持つ別のプロジェクトへの参照を追加した後にこの問題が発生し、参照を削除した後も問題が続きました。

追加された参照の.dllファイルをbinフォルダーから削除して再構築することで解決しました。

0
Logan Miller

他の多くの人と同様に、VS2017メニューから新しいMVCテンプレートプロジェクトを作成した後、この問題が発生しました。プロジェクトをビルドすると、opのエラーメッセージが表示されます。その後、答えを使用しました https://stackoverflow.com/a/15651619/2417292 mvc4プロジェクトの cooloverride によってこのスレッドで以前に投稿されました。それでも問題は解決しなかったため、ホームビューフォルダーとHomeControllerファイルの名前を、ビューフォルダーCompany /およびコントローラーファイルCompanyControllerに変更しました。これは私にとってはうまくいきました、言い方による修正ではなく、ホーム/インデックスのルートを持つことに固執していない場合の回避策は、エラーの原因となる参照を見つけることができず、Azure WebApplication vs full VM完全なファイルシステムを使用し、IIS設定を混乱させる。

0
Eddie.Power_AU