Probleme mit mehreren gleichnamigen Controllern in meinem Projekt

96

Bei meinem ASP.NET MVC 3-Projekt tritt der folgende Fehler auf:

Es wurden mehrere Typen gefunden, die dem Controller mit dem Namen "Home" entsprechen. Dies kann passieren, wenn die Route, die diese Anforderung bedient ('Home / {action} / {id}'), keine Namespaces angibt, um nach einem Controller zu suchen, der der Anforderung entspricht. Wenn dies der Fall ist, registrieren Sie diese Route, indem Sie eine Überladung der 'MapRoute'-Methode aufrufen, die einen' Namespaces'-Parameter verwendet.

Die Anforderung für 'Home' hat die folgenden übereinstimmenden Controller gefunden: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController

Ich habe einen HomeController in meinem Standard-Controller-Ordner mit dem Klassennamen MyCompany.MyProject.WebMvc.Controllers.HomeController.

Meine RegisterRoutes-Methode in meiner global.asax sieht folgendermaßen aus:

    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
        );
    }

Ich habe dann einen Bereich namens Company mit einem HomeController im Standard-Controller-Ordner für den Bereich mit dem Klassennamen MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController.

Die RegisterArea-Methode in der CompanyAreaRegistration-Datei sieht folgendermaßen aus:

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

Dies alles führt zu dem Fehler, den ich am Anfang dieses Beitrags hervorgehoben habe. Ich habe Mühe, eine Lösung aus verschiedenen anderen Beiträgen zusammenzustellen, ohne Glück .

Ist es möglich, einen HomeController im Standard-Controller-Ordner und dann einen in JEDEM Bereich zu haben? Wenn ja, muss ich (sofern ich dies tue) Änderungen an meiner Konfigurationsdatei vornehmen, damit dies funktioniert?

Jede Hilfe wäre sehr dankbar!

Mattruma
quelle
Weitere Informationen finden Sie unter stackoverflow.com/a/12633541/2089963 . Es funktioniert für mich
Syed Mohamed
Dies ist mir passiert, als ich das Projekt / die Assembly umbenannt habe. Ich habe gerade den Ordner bin gelöscht und das Projekt neu kompiliert, und es hat einwandfrei funktioniert.
Core

Antworten:

167

Die Fehlermeldung enthält die empfohlene Lösung: "Wenn dies der Fall ist, registrieren Sie diese Route, indem Sie eine Überladung der 'MapRoute'-Methode aufrufen, die einen' Namespaces'-Parameter verwendet."

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"}
);

Dadurch wird http: // server / zur Indexaktion Ihres HomeControllers, die meiner Meinung nach genau das ist, was Sie wollen. http: // server / company / home wechselt zur HomeController-Indexaktion des Unternehmensbereichs, wie in der Bereichsregistrierung definiert.

David Ruttka
quelle
1
Ich habe es nicht getestet, aber der namespacesParameter ist ein String-Array, daher sollten Sie in der Lage sein, eine beliebige Zahl zu übergeben, indem Sie dem Array hinzufügen:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
David Ruttka
2
Dieses Namespace-Muster hat bei mir nicht funktioniert. MyProject.Controllerstat jedoch.
Der Muffin-Mann
Ich habe es versucht. Der Index in dieser MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeControllerKlasse wird jedoch ausgeführt. Aber die Ansicht erscheint ist die alte.
kbvishnu
Es ist nichts wert, dass der 4. Parameter hier aufgrund von Typinferenz und variabler Bedeutung etwas verwirrend sein kann. Der 4. Parameter kann ein Zeichenfolgenarray sein, das durch den Namespace eingeschränkt werden soll, ein Objekt zum Hinzufügen von IRouteConstraints ODER Zeichenfolgen, die als Einschränkungen interpretiert werden können, oder Sie können 5 Parameter haben und beide einschließen. aspnetwebstack.codeplex.com/SourceControl/changeset/view/…
Chris Moschini
Beachten Sie auch, dass ein Pfad standardmäßig den Weg zu anderen Namespaces findet. Wenn Sie einen Pfad zu einem Namespace oder einer Reihe von Namespaces sperren möchten, müssen Sie diesen Fallback deaktivieren: bubblogging.wordpress.com/2012/06/09/mvc- Routing-Namespaces (Ende der Seite)
Chris Moschini
30

Dies ist der asp.net mvc4-Ansatz:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );
cooloverride
quelle
2
Danke, das hat es für mich gelöst, obwohl ich für mein ganzes Leben nicht herausfinden kann, warum meine Anwendung glaubt, dass es überhaupt zwei Home-Controller gibt. Ich habe den Namespace durchsucht und ersetzt, was anscheinend das Problem verursacht hat, aber eine Suche in der gesamten Lösung zeigt keine Instanzen des Rogue-Namespace an.
Yann Duran
12
Nun, ich habe die Ursache meines Problems gefunden. Hoffentlich kann dies jemand anderem helfen, der verzweifelt sucht, wie ich es heute war. Da ich den Namen der Anwendung (sowie den Namespace) geändert hatte, befand sich noch eine DLL im Ordner bin, die nicht durch eine Bereinigung gelöscht wurde. Unter der Decke muss etwas MEF-Magie vor sich gehen. Sobald ich die alte DLL entdeckt und gelöscht habe, ist das Problem behoben. Kein Wunder, dass eine Textsuche es nicht gefunden hat!
Yann Duran
@YannDuran, stieß auf ein ähnliches Problem und Ihr behobenes half. Vielen Dank.
Klaus Nji
12

Ich hatte die Namespaces umbenannt, also lösche ich nur die Ordner bin und obj und erstelle neu , arbeite wieder.

Reynaldo
quelle
2

benutze das

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

Verwenden Sie nur den Namen des Projekts:

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
Glownet
quelle
1

Wenn Sie RazorGenerator verwenden, namespacesreicht es möglicherweise nicht aus , nur den Parameter zu informieren .

Ich muss lösen, indem ich die unten markierte Aussage hinzufüge 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
    }
Leonel Sanches da Silva
quelle
0

Wie Chris Moschini erwähnt, reicht der Parameter "Namespaces" möglicherweise nicht aus, wenn Sie zwei Bereiche mit demselben Controllernamen und unterschiedlichen Namespaces haben und die Standardroute "Keine Bereiche" 500 Serverfehler zurückgibt.

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"}
);

Es ist "am besten", den Standardroutenhandler zu überschreiben und diese Zeile hinzuzufügen:

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

Ich hatte dieses Problem, nachdem ich einen Verweis auf ein anderes Projekt mit denselben Routen hinzugefügt hatte, und das Problem wurde fortgesetzt, nachdem ich den Verweis entfernt hatte.

Behebung durch Löschen der DLL-Datei dieser hinzugefügten Referenz aus dem Ordner bin und erneutes Erstellen.

Logan Miller
quelle
0

Wie bei vielen anderen hatte ich dieses Problem, nachdem ich ein neues MVC-Vorlagenprojekt aus dem VS2017-Menü erstellt hatte. Beim Erstellen des Projekts wurde die Fehlermeldung der Operation angezeigt. Ich habe dann die Antwort https://stackoverflow.com/a/15651619/2417292 verwendet, die zuvor in diesem Thread von cooloverride für mvc4-Projekte veröffentlicht wurde. Dadurch wurde mein Problem immer noch nicht behoben, sodass ich meinen Home-Ansichtsordner und meine HomeController-Datei in den Ansichtsordner Company / und die Controller-Datei CompanyController umbenannte. Dies funktionierte dann für mich, kein Fix per say, sondern eine Problemumgehung, wenn Sie nicht an der Route Home / Index festhielten. Mein anderes Problem war, dass ich die Referenz, die den Fehler verursacht, nicht finden konnte und meine Entwicklungsplattform Azure WebApplication vs a war vollständige VM mit einem vollständigen Dateisystem und IIS-Einstellungen, mit denen Sie sich herumschlagen können.

Eddie.Power_AU
quelle
0

Ich hatte das gleiche Problem und stellte fest, dass die ältere Version kompilierte Dateien im Ordner "bin" erstellt hatte.

Sobald ich diese gelöscht habe, ist der Fehler verschwunden.

Pavan Arunod
quelle