Überschreiben / Erweitern eines MVC-Controllers / Bereichs

8

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

  • Ich habe versucht, das Schlüsselwort partial für beide Deklarationen der Klasse zu verwenden, aber da sie sich in verschiedenen Projekten / Assemblies befinden, glaube ich nicht, dass das funktioniert.
  • Ich habe ein Build-Ereignis definiert, das die benutzerdefinierte DLL in das Verzeichnis bin des MVC-Hauptprojekts verschieben würde, aber das schien nicht wie erwartet zu funktionieren.
  • Ich habe verschiedene Ansätze für die Vererbung ausprobiert, in der Hoffnung, dass die neue Klasse abgeholt werden würde, aber diese funktionierte nicht (erhielt den doppelten Controller-Deklarationsfehler).
  • Ich habe gelesen, dass ich versucht habe, eine benutzerdefinierte ControllerFactory zu verwenden, aber ich wusste nicht, wie ich sie implementieren soll.
  • Ich habe versucht, im Bereich AreaRegistration benutzerdefinierte Namespace-Routing-Parameter zu definieren, um den neuen Controller wie im folgenden Beispiel zu verwenden.

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:

  • Geerbt von der Basis FooController im Hauptprojekt innerhalb eines anderen Projekts / einer anderen Lösung.
  • Richten Sie das Attribut-Routing so ein, dass auf den benutzerdefinierten Controller zugegriffen werden kann, um Konflikte mit Routen aus dem Hauptprojekt zu vermeiden.
  • Es wurde ein Build-Ereignis erstellt, das die benutzerdefinierte DLL in das Hauptprojekt verschiebt, wenn sie vom neuen benutzerdefinierten Projekt erstellt wird (also zugänglich ist).

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?

    
Thomas Johnson 06.06.2016, 13:34
quelle

1 Antwort

6

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:

%Vor%

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:

%Vor%

Wenn Sie Areas verwenden, sollten Sie dies auch in der entsprechenden Routes.MapMvcAttributeRoutes() -Datei konfigurieren:

%Vor%

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:

%Vor%

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:

%Vor%

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:

    
Rion Williams 08.06.2016 20:20
quelle

Tags und Links