Ich arbeite gerade an einem MVC-Projekt und versuche herauszufinden, wie ich die Routen eines vorhandenen Controllers innerhalb eines Gebiets erweitern könnte, speziell von einem anderen Projekt.
Zum Beispiel habe ich einen Controller mit einem Bereich, der wie folgt aussieht:
%Vor%Und was ich tun möchte, ist in der Lage, einen anderen Controller innerhalb eines separaten Projekts zu definieren, der das folgendermaßen erweitern könnte:
%Vor% Grundsätzlich möchte ich, dass die Controller fast so funktionieren, als würde ich das Schlüsselwort partial
verwenden (damit ich eine der Aktionen im Original oder im Neuen aufrufen kann).
Das Hauptproblem
Was ich wirklich erreichen möchte, ist, dass ich ein Hauptprojekt mit mehreren Bereichen und einen anderen Bereich meiner Lösung mit verschiedenen Client-Ordnern habe. Ich möchte in der Lage sein, die Basis-Controller für mein Hauptprojekt wesentlich zu erweitern und mandantenspezifische Aktionen in diesen Client-Ordnern hinzuzufügen, damit sie im Hauptprojekt verwendet werden können. Ich mache das bereits mit bestimmten MVC Views, aber ich hatte gehofft, dass ich es auch mit Controllern erreichen könnte.
Was ich versucht habe
partial
für beide Deklarationen der Klasse zu verwenden, aber da sie sich in verschiedenen Projekten / Assemblies befinden, glaube ich nicht, dass das funktioniert. bin
des MVC-Hauptprojekts verschieben würde, aber das schien nicht wie erwartet zu funktionieren. ControllerFactory
zu verwenden, aber ich wusste nicht, wie ich sie implementieren soll. Routing-Beispiel (Bereichsregistrierung)
%Vor%Aktualisieren
Ich versuchte einen Ansatz hier zu sehen , wie es bei einigen Kommentardiskussionen der Fall war, die einfach mit der Vererbung zu tun hatten:
%Vor%Also meine derzeitigen Schritte sind wie folgt:
FooController
im Hauptprojekt innerhalb eines anderen Projekts / einer anderen Lösung. Das schien keinen Unterschied zu machen. Ich habe versucht, zur Foo/Bar
url zu gehen, aber es hat nur einen 404 geworfen, als ob er es überhaupt nicht gesehen hätte. Die Datei CustomFooController.cs
befindet sich in einem separaten Projekt und ist nur eine Klassendatei und kein MVC-Projekt. Ist das richtig? Muss ich die Routing-Regeln im Hauptprojekt festlegen?
Controller-Vererbung
Die Verwendung von Vererbung als Chris , die im Kommentarabschnitt erwähnt wird, ist wahrscheinlich der beste Weg, dies auch zu tun . Dies gilt insbesondere dann, wenn Sie in Ihrem Beispiel bereits von einer anderen Basis-Controller-Klasse wie ApplicationController
abgeleitet sind:
Das Attribut-Routing ist hier extrem wichtig, da Sie nicht möchten, dass Ihre bestehenden Routen Ihre beiden Controller verwirren oder übersehen.
Registrieren von Attributrouten
Da Sie das Attribut routing über das [Route]
-Attribut in Ihrem ProjectB-Abschnitt verwenden, sollten Sie sicherstellen, dass Sie es explizit in RouteConfig.cs
Ihres ProjectA-Projekts festlegen, damit es über die% -Profile ordnungsgemäß identifiziert werden kann. co_de% Methode wie folgt:
Wenn Sie Areas verwenden, sollten Sie dies auch in der entsprechenden Routes.MapMvcAttributeRoutes()
-Datei konfigurieren:
Scoping-Routen
Schließlich sollten Sie Ihre Routen unbedingt so weit "im Blickfeld" haben, dass Sie Ihren Hauptnamensraum innerhalb von AreaRegistration.cs
Ihrer Hauptanwendung von ProjectA priorisieren:
Referenzen über erhalten
Sie haben erwähnt, dass Sie ein Build-Ereignis verwenden, um die DLL von Ihrem ProjectB-Projekt in Ihr Haupt-ProjectA-Projekt zu kopieren, was in diesem Fall in Ordnung sein sollte. Du wirst im Grunde einige Wege brauchen, um darauf zuzugreifen und ein einfaches RouteConfig.cs
wie das Folgende sollte in den meisten Szenarien in Ordnung sein:
Alles zusammenfügen
Wenn Sie alle diese Schritte richtig verdrahtet haben, sollten Sie in der Lage sein, Ihre vorhandene Lösung zu bereinigen / neu zu erstellen. Nachdem Sie dies getan haben, überprüfen Sie, ob Sie die entsprechende DLL in Ihrem ProjectA xcopy
-Verzeichnis haben:
Wenn das da ist, dann sind Sie auf dem richtigen Weg und sollten in der Lage sein, Ihre Hauptanwendung auszuführen und zu bin
zu navigieren, um folgendes zu sehen:
Ebenso sollte das Navigieren zu ~/Foo
die entsprechende Attributroute, die in Ihrem anderen Controller definiert wurde, übernehmen und den richtigen Inhalt liefern:
Tags und Links asp.net-mvc c# asp.net