wake-up-neo.com

Der Controller für Pfad wurde nicht gefunden oder implementiert IController nicht

Ich habe ein MVC4-Projekt mit Sprachauswahl:

  • en
  • nl
  • fr
  • de

1 Hauptteil mit:

  • Über
  • Häufig (für das Menü)
  • Kontakt
  • FAQ
  • Zuhause

Und 3 Bereiche:

  • Administrator
  • Kunden
  • Geschäft

In jedem Bereich habe ich mindestens einen Controller, zum Beispiel in Admin habe ich den Controller Überblick mit dem entsprechenden Ansichtsordner Überblick der eine index.aspx Seite enthält.

Die Startseite und alle Hauptseiten (Info, FAQ usw.) funktionieren und können aufgerufen werden.

Wenn ich jedoch der URL folge: localhost: xxxx/de/admin/overview Ich erhalte den Fehler 

Der Controller für Pfad '/ de/admin/overview' wurde nicht gefunden oder implementiert IController nicht.

Obwohl die Route korrekt ist (ich kann dies mit dem Route Debugger sehen). Die Fehlerseite zeigt auch an, dass der Fehler beim Laden meiner Hauptmenüelemente ausgelöst wurde:

<nav id="site-navigation" class="eightcol">
    @Html.Action("MenuItems", "Common")
</nav>

- Code wurde entfernt, weil irrelevant -

Alles scheint in Ordnung zu sein, aber MVC scheint das Menü nicht laden zu können, das sich im Hauptteil befindet.

Die Wurzel des Problems lautet also: Kann ich den Controllern im Hauptteil (Home, Common, About usw.) meines Projekts einen Bereich (z. B. Admin) gewähren?

66
reaper_unique

Ich habe es gefunden.

Wenn eine Seite, die sich in einem Bereich befindet, auf einen Controller zugreifen möchte, der sich außerhalb dieses Bereichs befindet (z. B. eine freigegebene Layoutseite oder eine bestimmte Seite in einem anderen Bereich), muss der Bereich dieses Controllers hinzugefügt werden. .__ Da sich der gemeinsame Controller nicht in einem bestimmten Bereich befindet, sondern Teil des Hauptprojekts ist, müssen Sie den Bereich leer lassen:

@Html.Action("MenuItems", "Common", new {area="" }) 

Das obige muss zu allen Aktionen und Aktionslinks hinzugefügt werden, da die Layoutseite in den verschiedenen Bereichen gemeinsam genutzt wird.

Es ist genau das gleiche Problem wie hier: ASP.NET MVC-Bereiche mit gemeinsamem Layout

Edit: Um es klar zu sagen, wird dies als Antwort markiert, weil es die Antwort auf mein Problem war. Die obigen Antworten lösen möglicherweise die Ursachen, die denselben Fehler auslösen.

108
reaper_unique

In meinem Fall bezog sich derselbe Fehler nicht auf Area, es wurde jedoch angenommen, dass der Fehler in meinem Fall veröffentlicht wurde. Dies kann für die Personen hilfreich sein, die zu diesem Thread kommen, indem sie suchen "Der Controller für Pfad wurde nicht gefunden oder implementiert IController nicht "

Der Fehler wurde aufgrund eines falschen Eintrags in der Datei _Layout.cshtml verursacht. 

@Styles.Render("~/Content/misc")

Das Bundle mit diesem Namen wurde in BundleConfig.cs entfernt, es wurde jedoch vergessen, es in _Layout.cshtml zu entfernen

Es war dumm, aber wir Programmierer machen immer viele dumme Fehler :)

14
Tejasvi Hegde

Für diejenigen, die mit der obigen Lösung nicht funktionierten, funktionierte Folgendes für mich:

Ich habe eine Lösung mit mehreren Projekten. Alle Projekte waren in MVC3. Ich habe Visual Studio 2012 auf meinem Computer installiert, und anscheinend wurden einige Projekte automatisch auf MVC4 aktualisiert. 

Ich habe dieses Problem bekommen 

Der Controller für Pfad '/ etc/etc' wurde nicht gefunden oder implementiert IController nicht

weil das Projekt, das diese Route abwickelte, auf MVC4 verweist. 

Ich musste ihre Referenzen manuell aktualisieren, um MVC3 zu verwenden. Sie können dies auch tun, indem Sie die .csproj-Datei mit einem Texteditor öffnen. Suchen Sie den Verweis auf MVC3 und entfernen Sie diese Zeile: 

<SpecificVersion>False</SpecificVersion>
14

Dieser Fehler kann auch durch die Tatsache verursacht werden, dass Controller (in ihrem Namen) das Wort Controller haben müssen. nämlich: HomeController; es sei denn, Sie implementieren Ihre eigene ControllerFactory.

12
George Stocker

in meinem Fall bestand das Problem darin, dass die Controller-Klasse nicht öffentlich bekannt gegeben wurde.

class WorkPlaceController : Controller

die Lösung war

public class WorkPlaceController : Controller
11
SoaperPlus

Eine weitere mögliche Ursache für diesen Fehler ist, wenn der Namespace für die Bereichsregistrierungsklasse nicht mit dem Namespace für den Controller übereinstimmt.

Z.B. korrekte Benennung auf Controller-Klasse:

namespace MySystem.Areas.Customers
{
    public class CustomersController : Controller
    {
        ...
    }
}

Bei falscher Benennung für die Gebietsregistrierungsklasse:

namespace MySystem.Areas.Shop
{
    public class CustomersAreaRegistration : AreaRegistration
    {
        ...
    }
}

(Der obige Namespace sollte MySystem.Areas.Customers sein.)

Lerne ich jemals, das Kopieren und Einfügen von Code zu beenden? Wahrscheinlich nicht.

9
Carl

Hier ist mein Problem und die Lösung, die für mich funktioniert hat.

Ich habe einen neuen Controller mit einer einzigen Aktion hinzugefügt, die eine Zeichenfolge an eine vorhandene Anwendung zurückgibt. Als ich jedoch über einen Browser zu diesem Controller navigierte, erhielt ich den gleichen Fehler wie oben erwähnt. 

Nachdem ich viel gegoogelt hatte, fand ich heraus, dass ich einfach meine Global.asax.cs-Datei ändern musste, um den neuen Controller zu erkennen. Alles, was ich getan habe, war ein Leerzeichen in die Datei Global.asax.cs, damit sie geändert wird und funktioniert hat

6
armulator

In meinem Fall stimmte der Parameter namespaces nicht mit dem Namespace des Controllers überein. 

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new {controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "Web.Areas.Admin.Controllers" }
    );
}
6

In meinem Fall hatte ich @{ Html.RenderAction("HeaderMenu", "Layout", new { Area = string.Empty }); } in _Layout.cshtml, aber der LayoutController existierte nicht! (Ich hatte _Layout.cshtml aus einer anderen Lösung kopiert, aber vergessen, den Controller zu kopieren.)

5
Rush Frisby

Ich bin nicht sicher, ob dies die Lösung aus einem anderen Blickwinkel als der akzeptierten Antwort trifft, aber ich habe festgestellt, dass einer meiner Controller im Bereich "Bereiche" im falschen Namespace lag. Korrigieren des Namespaces in:

Areas.{AreaName}.Controller

behebte das Problem für mich.

Ich vermute, der Schlüsselfaktor war, dass alle Controller in einem bestimmten Bereich denselben Namespace haben.

5
Richard Freeman

Eine weitere Ursache für diesen Fehler: Zufällige Verwendung von Html.Action in einer Layoutdatei, in der Html.ActionLink vorgesehen sein könnte. Wenn die von Html.Action referenzierte Ansicht dieselbe Layoutdatei verwendet, haben Sie tatsächlich eine Endlosschleife erstellt. (Die Layoutansicht lädt die referenzierte Ansicht als Teilansicht, wodurch die Layoutansicht geladen wird, die die referenzierte Ansicht lädt ...) Wenn Sie einen Haltepunkt in der Layoutdatei festlegen und einen einzelnen Schritt durch das Htlm.Action-Objekt setzen, wird dies manchmal hilfreich sein Meldung über übermäßige Stapelgröße. 

Peinlich ist das Problem in meinem Fall, dass ich den Code nach dem Hinzufügen des Controllers nicht neu erstellt habe .

Daher ist es vielleicht das erste, was Sie überprüfen müssen, ob Ihr Controller in den Binaries erstellt wurde (und öffentlich ist). Wenn Sie wie ich sind, können Sie einige Minuten des Debugging sparen.

2
Tom Pažourek

Wenn dies für Ihr Design angemessen ist, können Sie sicherstellen, dass der Zugriffsmodifizierer für Ihre Controller-Klasse "public" ist und nicht der Zugriff eingeschränkt werden kann, wie "internal" oder "private".

1
Chris Halcrow

In einem anderen Szenario möchte ich nur Folgendes hinzufügen: In meinem Szenario war der Namensraum für Controller anders, da es ein Fehler war, Controller aus einem anderen Projekt zu kopieren.

1
LifeOfPi

Dieses Problem tritt auch auf, wenn Sie Ihre Controller-Klasse für Compile-Process nicht in die .csproj-Dateien aufnehmen.

<Compile Include="YOUR_CONTROLLER_PATH.cs" />
1
Ismail Yilmaz

In meinem Fall einer älteren Anwendung trat das Problem auf, als ich den folgenden Eintrag in der Datei web.config unter dem Knoten <system.webServer>

       <modules runAllManagedModulesForAllRequests="true"></modules>

Als ich es entfernte, wurde das Problem behoben. 

1

In meinem Fall lag es daran, dass der Controller falsch benannt war. Ich habe LayoutController aufgerufen, hätte aber stattdessen Layout aufrufen sollen:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "LayoutController" })</a>

sollte sein:

<a class="nav-link" href="#">@Html.Action("GetCurrentUser", "Layout")</a>
1
live-love

In meinem Fall in der Methode "global.asax/application_start".... Habe ich Web-API-Routen registriert, nachdem mvc-Routen wie folgt:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

Durch das Zurücksetzen der Bestellung wurde das Problem behoben

GlobalConfiguration.Configure(WebApiConfig.Register);            
RouteConfig.RegisterRoutes(RouteTable.Routes);
0
Ege Tuncoz

Aufbauend auf dieser answer von George fand ich in meinem Fall, dass ich meinen Controller richtig als ThingController eingerichtet hatte und eine richtig definierte Methode auf diesem Controller Edit hatte.

Aber ich habe es aus meiner Sicht mit gemeint

<a href="/App/ThingController/Edit" />

Wo hätte ich nur den Namen ohne den Word-Controller verwenden sollen

<a href="/App/Thing/Edit" />

0
Xynos