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


96

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

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

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

デフォルトのコントローラーフォルダーにHomeControllerがあり、クラス名はMyCompany.MyProject.WebMvc.Controllers.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をデフォルトのコントローラフォルダに入れてから、それぞれの領域に置くことはできますか?もしそうなら、私はこれを機能させるために私の設定ファイルに変更を加える必要があると思いますか?

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


このstackoverflow.com/a/12633541/2089963を参照してください。それは私のために働く
Syed Mohamed

これは私がプロジェクト/アセンブリの名前を変更したときに起こり、binフォルダーを削除してプロジェクトを再コンパイルしただけで、問題なく動作しました。
2016年

回答:


167

エラーメッセージには推奨される解決策が含まれています。「この場合は、「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アクションに移動します。


1
私はそれをテストしていませんが、namespacesあなたは配列に追加することで、任意の数を渡すことができる必要がありますので、パラメータは、文字列の配列である:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
デビッドRuttka

2
その名前空間パターンは私にはうまくいきませんでした。MyProject.Controllersしかしした。
マフィンマン

私はこれを試しました。しかし、このMyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerクラスのインデックスは実行中です。しかし、表示されるビューは古いものです。
kbvishnu 2013年

ここでの4番目のパラメーターは、型の推論と変数の意味のために少しわかりにくいかもしれません。4番目のパラメーターは、名前空間で制約する文字列配列、IRouteConstraintsまたは制約として解釈できる文字列を追加するオブジェクト、または5つのパラメーターで両方を含めることができます。aspnetwebstack.codeplex.com/SourceControl/changeset/view/...
クリスMoschini

また、パスがデフォルトで他の名前空間への経路を見つけることにも注意する必要があります。名前空間または名前空間のセットへのパスをロックする場合は、このフォールバックを無効にする必要があります。bubblogging.wordpress.com / 2012/06/09 / mvc-ルーティング名前空間(ページの下部)
Chris Moschini 2013年

30

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

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

2
おかげで、これで解決しましたが、私のアプリケーションがなぜ最初に2つのホームコントローラーがあると思うのか、私の人生を理解することはできません。問題の原因となっていると思われる名前空間の検索と置換を行いましたが、ソリューション全体を検索しても、不正な名前空間のインスタンスは表示されません。
Yann Duran 2013年

12
さて、私は私の問題の原因を見つけました。今日のように、これが他の誰かが必死に検索するのを助けるかもしれません。アプリケーションの名前(および名前空間)を変更したため、binフォルダーにDLLが残っており、クリーンアップによって削除されませんでした。カバーの下で起こっているいくつかのMEF魔法があるに違いありません。古いDLLを見つけて削除するとすぐに、問題は解消しました。テキスト検索で見つからなかったのも不思議ではありません。
Yann Duran

@YannDuran、同様の問題に遭遇し、あなたの修正が助けました。ありがとう。
クラウスNji 2013

12

私は名前空間の名前を変更していたので、deフォルダーのbinobj削除しrebuildを実行するだけで、再び機能します。



2

これを使って

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

1

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

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

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
    }

0

Chris Moschiniが言及しているように、名前空間が異なる同じコントローラー名の2つのエリアがあり、デフォルトのnoneエリアルートが500サーバーエラーを返す場合、namespacesパラメーターでは不十分な場合があります。

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

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

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


0

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



0

同じ問題があり、古いバージョンでは「bin」フォルダにコンパイル済みファイルが作成されていました。

これらを削除すると、エラーは消えました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.