Wir haben eine ASP.NET MVC 4-Anwendung mit etwa 3000 Ansichten darin. Wir haben uns entschieden, diese Ansichten in separate DLLs aufzuteilen und sie mit RazorGenerator zu kompilieren. Wir behalten nur Hauptdateien _Layout.cshtml und verwandte Dateien im MVC-Hauptprojekt bei.
Wir können keine Teilansichten aus der DLL zusammen mit der Hauptansicht im MVC-Hauptprojekt laden. Detaillierte Beschreibung ist unten.
Was bereits gemacht wurde:
Die Ansichten werden erfolgreich in DLLs kompiliert (ich habe bestätigt, dass sie sich in der Binärdatei befinden)
Das PrecompiledMvcEngine-Objekt wird für jede DLL erstellt und registriert, die Ansichten enthält. Verwenden Sie dazu den folgenden Code in Application_Start in Global.asax.cs:
.
%Vor%Was nicht funktioniert:
Ich kann eine im MVC-Hauptprojekt definierte Ansicht (z. B. _Layout.cshtml) nicht laden, wenn die Teilansicht in einer der Bibliotheken definiert ist (z. B. Partial.cshtml). Ich verwende den folgenden Code in der Aktion des Controllers, um dem MVC-Framework mitzuteilen, welche Ansicht ich angefordert habe:
%Vor%Die Fehlermeldung sagt: Die Ansicht '~ / Views / Partial.cshtml' oder ihr Master wurde nicht gefunden oder keine View-Engine unterstützt die gesuchten Orte. Folgende Orte wurden durchsucht: ~ / Ansichten / Partial.cshtml ~ / Ansichten / Freigegeben / _Layout.cshtml
Wenn ich versuche, die Ansichten separat zu laden, indem ich entweder Folgendes festlege:
%Vor%oder
%Vor%, die richtige Ansicht wird gefunden. Jedoch brauche ich sie zusammen geladen werden. Der Code funktioniert, wenn alle benötigten .cshtml-Dateien im MVC-Hauptprojekt vorhanden sind.
Beachten Sie, dass die Ansichten in kompilierten DLLs PageVirtualPathAttribute mit demselben Pfad wie in der Controller-Aktion angegeben haben, z. B .:
%Vor%Zusammenfassend lautet die Frage, wie die im Haupt-MVC-Projekt gespeicherte Hauptansicht mit einer in einem anderen Projekt definierten partiellen kompilierten Ansicht aufgerufen werden kann.
Beim App-Start, wenn Ihre App diese Zeile aufruft ...
%Vor% Die Baugruppen, die Ihre externen Ansichten enthalten, wurden wahrscheinlich noch nicht geladen und sind daher nicht als Ansichtsmaschinen enthalten. Ich würde tatsächlich empfehlen, trotzdem AppDomain.CurrentDomain.GetAssemblies()
zu verwenden, da das alle beim Start geladenen Assemblies enthält.
Die Lösung besteht darin, zu jedem das RazorGenerator.Mvc NuGet-Paket hinzuzufügen Projekt, das kompilierte Ansichten enthält. Dadurch wird der folgende App-Startcode ähnlich wie bei Ihnen hinzugefügt ...
%Vor% Beachten Sie, dass dadurch eine Ansichts-Engine erstellt wird, die die aktuelle Assembly (Ihre Sichten-Assembly) verwendet, und sie der statischen ViewEngines
-Auflistung (im Haupt-MVC-Projekt enthalten) hinzugefügt wird.
In der Produktion würde ich auch empfehlen, die Einstellung UsePhysicalViewsIfNewer
zu deaktivieren, was zu einem erheblichen Leistungsaufwand führt.
Terminologie
BaseMvc - mit Razor generierten Ansichten, Controllern usw.
ConsumerMvc - Hat Layout für dieses Projekt und Referenzen BaseMvc
Zusammenfassung
Erstellen Sie die Lieferung der Sicht im Basiscontroller. Die Ansicht verwendet ein Layout, das in ConsumerMvc über die _ViewStart.cshtml in BaseMvc vorhanden ist. Für meine Situation hatte ich Projekte mit unterschiedlichen Layouts, daher die Layout-Ansicht "Zeiger". Ich dachte es ein nützliches Beispiel.
Ich habe ein AREA
erstellt, damit ich ein Standardlayout festlegen konnte.
/Areas/Components/Controllers/ShoppingController.cs
%Vor%/Areas/Components/Views/Shopping/Basket.cshtml
%Vor%/Areas/Components/Views/_ViewStart.cshtml
%Vor%Link, auf den im Code-Kommentar verwiesen wird: Überschreiben der Ansicht in der ASP.NET MVC-Site funktioniert nicht
/Views/Shared/_Layout_Component.cshtml
%Vor% http://www.consumermvc.example.com/Components/Shopping/Basket
Nicht alle Baugruppen werden geladen, wenn Application_Start
aufgerufen wird. Fügen Sie einen zusätzlichen Handler hinzu:
Tags und Links razor asp.net-mvc-4 viewengine razorgenerator