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

78

Ich habe ein MVC4-Projekt mit Sprachauswahl:

  • en
  • nl
  • fr
  • de

1 Hauptteil mit:

  • Über
  • Common (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 die Controller- Übersicht mit der entsprechenden Ansichtsordner- Übersicht, die eine index.aspx- Seite enthält .

Die Homepage und alle Hauptseiten (about, faq, etc.) funktionieren und können besucht werden).

Wenn ich jedoch der URL folge: localhost: xxxx / de / admin / Übersicht, erhalte ich folgende Fehlermeldung:

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

Obwohl die Route korrekt ist (ich kann dies mit Route Debugger sehen), zeigt die Fehlerseite auch, dass der Fehler ausgelöst wurde, als ich meine Hauptmenüelemente laden wollte:

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

- Code entfernt, weil irrelevant -

Alles scheint in Ordnung zu sein, aber MVC scheint nicht in der Lage zu sein, das Menü zu laden, das sich im Hauptteil befindet.

Die Wurzel des Problems ist also: Kann ich einem Bereich (z. B. Admin) Zugriff auf die Controller im Hauptteil (Home, Common, About usw.) meines Projekts gewähren?

reaper_unique
quelle
Haben Sie versucht, den Aufruf von Html.Action auskommentieren, um das Problem auf den jeweiligen Controller zu beschränken?
Jonas Høgh
Ich hatte es noch nicht getan, aber jetzt tat ich es und es ist so, wie ich dachte. Der Bereich Admin verwendet die das Layout von dem Hauptteil meines Projektes und , wenn es die Aktion erreicht der Bereich versucht , den Controller zuzugreifen , die nicht in dem Bereich befindet, der den Fehler wirft. Mit anderen Worten, die Wurzel des Problems ist, wie kann ich einem Bereich Zugriff auf die Controller im Hauptteil (Home, Common, About usw. Controller) meines Projekts gewähren?
reaper_unique
2
Die Frage ist, mehr mögliche Probleme und Lösungen zu bekommen. Ich denke, es ist ein Muss, auch andere Antworten zu betrachten und nicht die einzige, die akzeptiert wird.
Alireza
Ich habe diese Nachricht erhalten, als relative Bildreferenzen in CSS wegen StyleBundles
KyleMit

Antworten:

120

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 gemeinsam genutzte 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 gemeinsam genutztem Layout

Bearbeiten : Um klar zu sein, wird dies als Antwort markiert, da es die Antwort für mein Problem war. Die obigen Antworten können die Ursachen beheben, die denselben Fehler auslösen.

reaper_unique
quelle
10
Danke, das hat bei mir funktioniert. Es ist eine sehr irreführende Fehlermeldung von .NET, dass der Controller für die Aktion innerhalb des Bereichs nicht gefunden werden kann, was überhaupt nicht der Fall ist!
Richard Fawcett
1
Dies hat mein Problem behoben. Ich denke, das nächste Mal sollte ich mit der Antwort auf den grünen Scheck beginnen, anstatt ganz oben auf der Liste.
Cameron Belt
'@ Html.Action ("About", "Home", new {area = ""})' löst einen Kompilierungsfehler aus, wenn es als leerer Bereich angegeben wird. Irgendwelche Vorschläge ?
Thamarai T
16

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

Der Fehler wurde durch eine falsche Eingabe in die Datei _Layout.cshtml verursacht.

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

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

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

Tejasvi Hegde
quelle
1
Danke für die Lösung. Es ist in der Tat möglich, dass es mehrere Lösungen für ein scheinbar identisches, aber tatsächlich nur ein ähnliches Problem gibt. Da meine Frage jedoch besagt, dass ich Bereiche verwende, ist meine selbst ausgewählte Lösung immer noch die genaueste.
reaper_unique
15

Für diejenigen, bei denen die oben genannte Lösung nicht funktioniert hat, gilt Folgendes:

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

Ich habe dieses Problem

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

weil das Projekt, das diese Route handhabte, auf MVC4 zeigte.

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>
Carlos Martinez T.
quelle
2
Oh mein Gott. Das ist so zufällig und dunkel. Vielen Dank für die Veröffentlichung! :) ZUKÜNFTIGE LESER: Meine war nur geringfügig anders - die DLL-Version selbst war 4.0 statt 3.0 - nicht sicher, wie sie geändert wurde.
Jared
Das Problem mit meinem war ähnlich; Ich hatte eine gemeinsam genutzte Bibliothek, auf die von der Präsentationsschicht verwiesen wurde und die einen gemeinsam genutzten Controller enthielt, und die gemeinsam genutzte Bibliothek verwendete mvc4, während die Präsentationsschicht mvc3 verwendete. Nachdem ich die gemeinsam genutzte Bibliothek auf MVC3 aktualisiert hatte, wurde das Problem behoben.
jbooker
13

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

ZB korrekte Benennung der Controller-Klasse:

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

Bei falscher Benennung in der Gebietsregistrierungsklasse:

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

(Namespace oben sollte sein MySystem.Areas.Customers.)

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

Carl Sharman
quelle
2
Dies hat mich erwischt und war schwer zu finden, da der Namespace falsch war, als er sich im Root-Controller-Ordner befand (Code aus einem anderen Projekt kopiert), aber es war egal, bevor ich ihn in einen Bereich verschoben habe.
Richard Garside
12

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

George Stocker
quelle
2
Das war mein Fehler. Danke George!
Wilky
Ich hatte dieses Problem. Das lag daran, dass ich meine Datei HomeController.cs gelöscht habe und nicht verstanden habe, was davon abhängt.
user2023861
Sie sind der CEO
Denys Wessels
12

In meinem Fall bestand das Problem darin, dass die Controller-Klasse nicht öffentlich angekündigt wurde.

class WorkPlaceController : Controller

Die Lösung war

public class WorkPlaceController : Controller
SoaperPlus
quelle
7

In meinem Fall namespacesstimmte der Parameter 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" }
    );
}
Alexander Puchkov
quelle
6

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

Ich habe einen neuen Controller mit einer einzelnen Aktion hinzugefügt, die eine Zeichenfolge an eine vorhandene Anwendung zurückgibt. Als ich jedoch über einen Browser zu diesem Controller navigierte, wurde der gleiche Fehler wie oben erwähnt angezeigt.

Nachdem ich viel gegoogelt hatte, stellte ich fest, dass ich einfach meine Global.asax.cs-Datei ändern musste, damit sie den neuen Controller erkennt. Ich habe der Datei Global.asax.cs lediglich ein Leerzeichen hinzugefügt, damit sie geändert wird und funktioniert

Armulator
quelle
Wir haben 3 Produktionswebserver und 5 Entwicklungs- / Testmaschinen. Nur auf einer Produktionsmaschine funktionierte es nicht. Durch Hinzufügen eines Speicherplatzes und Speichern von Global.asax wurde das Problem behoben. #mindblown
jbwebtech
5

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

Areas.{AreaName}.Controller

Das Problem wurde für mich behoben.

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

Richard Freeman
quelle
Ich wünschte, Sie könnten Lieblingsantworten und nicht nur Fragen. Ich bin so oft auf diese Antwort gestoßen. Es war einfach so hilfreich, danke.
Shelby115
5

Eine weitere Ursache für diesen Fehler: Versehentliche Verwendung von Html.Action in einer Layoutdatei, in der möglicherweise Html.ActionLink vorgesehen ist. Wenn die Ansicht, auf die von Html.Action verwiesen wird, dieselbe Layoutdatei verwendet, haben Sie effektiv eine Endlosschleife erstellt. (Die Layoutansicht lädt die referenzierte Ansicht als Teilansicht, die dann die Layoutansicht lädt, die die referenzierte Ansicht lädt ...) Wenn Sie einen Haltepunkt in der Layoutdatei und einen einzelnen Schritt durch die Htlm.Action setzen, erhalten Sie manchmal eine hilfreichere Meldung über übermäßige Stapelgröße.

Mike Smith - MCT - MVP
quelle
5

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 von einer anderen Lösung kopiert, aber vergessen, den Controller zu kopieren.)

Rush Frisby
quelle
4

In meinem Fall in der global.asax / application_start-Methode habe ich Web-API-Routen NACH MVC-Routen wie folgt registriert:

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

Durch Zurücksetzen der Bestellung wurde das Problem behoben

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

Gegebenenfalls können Sie sicherstellen, dass der Zugriffsmodifikator in Ihrer Controller-Klasse "öffentlich" ist und nicht den Zugriff einschränken kann, z. B. "intern" oder "privat".

Chris Halcrow
quelle
2

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

Vielleicht müssen Sie als Erstes überprüfen, ob Ihr Controller erstellt wurde und in den Binärdateien vorhanden (und öffentlich) ist. Wenn Sie wie ich sind, sparen Sie möglicherweise einige Minuten beim Debuggen.

Tom Pažourek
quelle
1
Das war natürlich mein Problem ... Es sind immer die dummen Dinge, die dich erwischen.
TJ Wolschon
2

Dies könnte daran liegen, dass der Pfad falsch war. Überprüfen Sie daher zuerst den Pfad und die Schreibweise des Controllers. In meinem Fall wurde mein Controller CampsController genannt und die Datei WebApiConfig.cs enthielt einen zusätzlichen Pfad.

Anstelle von: http: // localhost: 6600 / Camps

Es war: http: // localhost: 6600 / api / Camps

Ich hatte das API-Wort in der Datei WebApiConfig.cs nicht bemerkt:

config.Routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

Es könnte auch daran liegen, dass der Controller falsch benannt wurde. Hier habe ich 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>

Ein anderes Beispiel könnte sein, dass Sie schlechte Routenpfade definiert haben. Stellen Sie sicher, dass Ihre Pfade korrekt sind. Beispiel:

   [RoutePrefix("api/camps")]
   public class CampsController : ApiController

   [Route("{moniker}")]
   public async Task<IHttpActionResult> Get(string moniker)
Live-Liebe
quelle
1

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

Life of Pi: Schiffbruch mit Tiger
quelle
1

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

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

Als ich es entfernte, wurde das Problem behoben.

Prashant Deherkar
quelle
1

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

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

Aufbauend auf dieser Antwort von George stellte ich in meinem Fall fest, dass ich meinen Controller ordnungsgemäß eingerichtet hatte ThingControllerund eine ordnungsgemäß definierte Methode für diesen Controller hatte Edit.

Aber ... ich habe es aus meiner Sicht mit referenziert

<a href="https://stackoverflow.com/App/ThingController/Edit" />

Wo ich nur den Namen ohne das Wort Controller hätte verwenden sollen

<a href="https://stackoverflow.com/App/Thing/Edit" />

MysticVagabond
quelle
1

In meinem Fall habe ich eine andere Aktionsmethode für meinen Menüabschnitt in der Datei _layout.cshtml mit @ Html.Action ("Menü", "Menü") gerendert, während ich vergessen habe, einen Menü-Controller zu erstellen, und als Layout-Datei in meiner aktuellen Datei verwendet wurde In der Ansicht der Controller-Aktion wurde dieser Fehler in meiner aktuellen Aktion zum Rendern von Aktionen angezeigt. Versuchen Sie, in Ihrem Layout nachzuschauen und die Datei anzuzeigen, wenn Sie denselben Fehler gemacht haben

Neeraj Singh
quelle