Razor Generator: Verwendung der in einer Bibliothek kompilierten Ansicht als Teilansicht für den im mvc-Hauptprojekt definierten Master

9

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:

  1. Die Ansichten werden erfolgreich in DLLs kompiliert (ich habe bestätigt, dass sie sich in der Binärdatei befinden)

  2. 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.

    
tomash 23.11.2012, 10:38
quelle

3 Antworten

1

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.

    
Tom Bowers 06.06.2016 06:15
quelle
0

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.

BaseMvc 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

ConsumerMvc Beispiel

/Views/Shared/_Layout_Component.cshtml

%Vor%

Meine URL

http://www.consumermvc.example.com/Components/Shopping/Basket

    
Valamas 28.08.2015 02:55
quelle
0

Nicht alle Baugruppen werden geladen, wenn Application_Start aufgerufen wird. Fügen Sie einen zusätzlichen Handler hinzu:

%Vor%     
John Landheer 30.01.2014 12:01
quelle