Zuallererst ist es sicherlich eine gute Idee, Ihr Modell in ein separates Projekt zu integrieren. Wie Sie festgestellt haben, ist dies trivial.
In Bezug auf Controller und Ansichten sehe ich keinen offensichtlichen Vorteil darin, sie für die meisten grundlegenden Projekte zu trennen, obwohl Sie dies möglicherweise in einer bestimmten Anwendung besonders tun müssen.
Wenn Sie sich dafür entscheiden, müssen Sie dem Framework mitteilen, wie Sie Ihre Controller finden. Der grundlegende Weg, dies zu tun, ist die Bereitstellung Ihrer eigenen ControllerFactory. Sie können sich den Quellcode für die DefaultControllerFactory ansehen, um eine Vorstellung davon zu erhalten, wie dies gemacht wird. Das Subtypisieren dieser Klasse und das Überschreiben der GetControllerType-Methode (string controllerName) kann ausreichen, um das zu erreichen, was Sie verlangen.
Nachdem Sie Ihre eigene benutzerdefinierte ControllerFactory erstellt haben, fügen Sie Application_Start in global.asax die folgende Zeile hinzu, um dem Framework mitzuteilen, wo es zu finden ist:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Update: Lesen Sie diesen Beitrag und die Beiträge, auf die er verweist, um weitere Informationen zu erhalten. Siehe auch Phil Haacks Kommentar zu diesem Beitrag über:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
... was keine vollständige Lösung ist, aber möglicherweise gut genug für einfache Fälle.
Es ist zwar sinnvoll, eine eigene ControllerFactory zu erstellen, aber ich fand es bequemer, alle meine Controller in jedem Projekt zu definieren, sie jedoch von Controllern in meinem freigegebenen Projekt abzuleiten:
Dies hat den zusätzlichen Vorteil, dass Sie einen Platz haben, an dem Sie Ihre Controller-Logik platzieren können, die von Projekt zu Projekt unterschiedlich ist. Außerdem ist es für andere Entwickler einfacher, Ihre Controller-Logik schnell zu finden, da die Controller an der Standardposition vorhanden sind.
In Bezug darauf, ob dies ratsam ist, halte ich es für absolut sinnvoll. Ich habe eine gemeinsame Account Management-Logik erstellt, die ich zwischen Projekten teilen möchte, die ansonsten eine sehr unterschiedliche Geschäftslogik haben. Ich teile also mein Konto und meine Administrator-Controller, aber die anderen Controller sind spezifisch für ihre jeweiligen Projekte.
quelle
Fügen Sie in der Klasse den folgenden Code hinzu (Für Ihren Controller-Code)
}}
Fügen Sie im Ordner mvc project view den Ordner für Contact hinzu und erstellen Sie eine Call.cshtml-Datei.
Fügen Sie die Klassenbibliotheksprojektreferenz zu Ihrem Haupt-MVC-Projekt hinzu.
quelle
Mein Problem wurde behoben, nachdem ich die
System.Web.Mvc
NuGet-Referenz aktualisiert hatte, sodass MvcWebsite und Class Library dieselbeSystem.Web.Mvc
Version verwendenEs müssen keine Standard-Namespaces hinzugefügt werden
quelle
Die einfachste Form der Trennung, die ich verwende, besteht darin, die Ansichten "wie sie sind" im ursprünglichen MVC-Projekt beizubehalten, aber die Controller zu entfernen. Fügen Sie dann in einem neuen ClassLibrary-Projekt die Controller-Klassen hinzu und stellen Sie sicher, dass sie von Controller erben.
Die MVC-Routing-Engine leitet automatisch zu den Controllern in der ClassLibrary weiter, und die Controller erstellen automatisch die Ansichten aus dem ursprünglichen MVC-Projekt, sofern Ihre Referenzen und Verwendungen korrekt vorhanden sind.
Ich verwende diese Architektur, um ein HTML-Berichtsmodul zu implementieren, das getrennt von der Hauptlösung kompiliert und bereitgestellt werden kann. Endlich bin ich frei von SSRS!
quelle