345 Stimmen

Es wurden mehrere Typen gefunden, die mit dem Controller namens 'Home' übereinstimmen

Ich habe derzeit zwei voneinander unabhängige MVC3-Projekte online gehostet.

Die eine funktioniert einwandfrei, die andere nicht und zeigt mir die Fehlermeldung an:

Es wurden mehrere Typen gefunden, die dem Controller mit dem Namen "Home" entsprechen. Dies kann passieren wenn die Route die diese Anfrage bedient ('{controller}/{action}/{id}') keine Namespaces für die Suche nach einem Controller zu suchen, der der Anfrage entspricht.

Wenn dies der Fall ist, registrieren Sie diese Route, indem Sie eine Überladung der Methode 'MapRoute' aufrufen aufruft, die einen Parameter 'Namespaces' enthält.

Mein Hoster gibt mir FTP-Zugang, und in diesem Ordner habe ich zwei weitere Ordner, einen für jede meiner Anwendungen.

ftpFolderA2/foo.com

ftpFolderA2/bar.com

foo.com funktioniert einwandfrei. Ich veröffentliche meine Anwendung in meinem lokalen Dateisystem und übertrage dann die Inhalte per FTP, und es funktioniert.

Wenn ich bar.com hochlade und auszuführen versuche, tritt das oben beschriebene Problem auf und hindert mich daran, meine Website zu nutzen. Solange foo.com noch funktioniert .

Sucht bar.com von Controllern aus ÜBERALL innerhalb von ftpFolderA2 und findet deshalb einen anderen HomeController ? Wie kann ich ihn dazu bringen, nur im Ordner "Controller" zu suchen, wie es eigentlich sein sollte?

Fakten:

  1. Nicht genutzte Bereiche. Dies sind zwei völlig unabhängige Projekte. Ich lege jedes veröffentlichte Projekt in den jeweiligen Ordner. Nichts Ausgefallenes.
  2. Jedes Projekt hat nur 1 HomeController.

Kann jemand bestätigen, dass dies das Problem ist?

556voto

Kirk Woll Punkte 72923

Hier ist ein weiteres Szenario, in dem Sie mit diesem Fehler konfrontiert werden könnten. Wenn Sie Ihr Projekt umbenennen, so dass sich der Dateiname der Assembly ändert, ist es möglich, dass Sie zwei Versionen Ihrer ASP.NET Assembly haben, die diesen Fehler reproduzieren.

Die Lösung besteht darin, dass Sie zu Ihrem bin und löschen Sie die alten DLLs (ich habe es mit "Rebuild Project" versucht, aber das hat sie nicht gelöscht, also stellen Sie sicher, dass Sie die bin um sicherzustellen, dass sie verschwunden sind)

498voto

Darin Dimitrov Punkte 990883

Diese Fehlermeldung tritt häufig auf, wenn Sie Bereiche verwenden und Sie haben denselben Controller Name innerhalb des Bereichs und die Wurzel. Zum Beispiel haben Sie die beiden:

  • ~/Controllers/HomeController.cs
  • ~/Areas/Admin/Controllers/HomeController.cs

Um dieses Problem zu beheben (wie es die Fehlermeldung vorschlägt), könnten Sie bei der Deklaration Ihrer Routen Namespaces verwenden. Also in der Hauptroutendefinition in Global.asax :

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

und in Ihrem ~/Areas/Admin/AdminAreaRegistration.cs :

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Areas.Admin.Controllers" }
);

Wenn Sie keine Bereiche verwenden, scheinen Ihre beiden Anwendungen innerhalb derselben ASP.NET-Anwendung gehostet zu werden, und es kommt zu Konflikten, weil Sie dieselben Controller in verschiedenen Namensräumen definiert haben. Sie müssen IIS so konfigurieren, dass diese beiden Anwendungen als separate ASP.NET-Anwendungen gehostet werden, wenn Sie diese Art von Konflikten vermeiden wollen. Fragen Sie Ihren Hosting-Anbieter danach, wenn Sie keinen Zugang zum Server haben.

68voto

Developer Punkte 23523

In MVC4 & MVC5 ist es ein wenig anders, verwenden Sie folgende

/App_Start/RouteConfig.cs

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

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

und in Gebieten

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                new[] { "MyNamespace.Areas.Admin.Controllers" }
            );

38voto

Tom Punkte 14831

Sehen Sie sich das an... http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Dann dieses Bild (ich hoffe, Sie mögen meine Zeichnungen)

enter image description here

34voto

Sruit A.Suk Punkte 6656

In Ihrem Projekt bin/ Ordner

stellen Sie sicher, dass Sie nur Ihre PROJEKT_PACKAGENAME.DLL

und entfernen ANDERES_PROJEKT_PACKAGENAME.DLL

die hier versehentlich erscheinen könnten, oder Sie benennen Ihr Projekt einfach um

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X