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?
quelle
Antworten:
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.
quelle
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 :)
quelle
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
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:
quelle
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.
quelle
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 eigenenControllerFactory
.quelle
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
quelle
In meinem Fall
namespaces
stimmte 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" } ); }
quelle
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
quelle
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:
Das Problem wurde für mich behoben.
Ich vermute, der Schlüsselfaktor war, dass alle Controller in einem bestimmten Bereich denselben Namespace haben.
quelle
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.
quelle
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.)quelle
In meinem Fall in der global.asax / application_start-Methode habe ich Web-API-Routen NACH MVC-Routen wie folgt registriert:
Durch Zurücksetzen der Bestellung wurde das Problem behoben
quelle
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".
quelle
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.
quelle
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)
quelle
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.
quelle
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.
quelle
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" />
quelle
Aufbauend auf dieser Antwort von George stellte ich in meinem Fall fest, dass ich meinen Controller ordnungsgemäß eingerichtet hatte
ThingController
und eine ordnungsgemäß definierte Methode für diesen Controller hatteEdit
.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" />
quelle
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
quelle