it-swarm.com.de

Wo und wie ist die _ViewStart.cshtml-Layoutdatei verknüpft?

Hier ist die About.cshtml aus der Standardvorlage von MVC 3:

@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
     Put content here.
</p>

Ich würde erwarten, dass ein Verweis auf die _ViewStart-Datei im About.cshtml gefunden wird, aber es ist eindeutig nicht der Fall.

Ich habe in global.asax und web.config nachgesehen, aber ich kann nicht herausfinden, wie die About.cshtml-Datei mit dem Layout aus der _ViewStart-Datei "verknüpft" wird. 

Alles funktioniert wie erwartet, ich würde gerne wissen, was unter der Haube vorgeht ...

182
Kman

Aus ScottGus Blog :

Ab der ASP.NET MVC 3 Beta-Version können Sie jetzt eine Datei hinzufügen namens _ViewStart.cshtml (oder _ViewStart.vbhtml für VB) unter der Ordner\Views Ihres Projekts:

Die _ViewStart-Datei kann verwendet werden, um allgemeinen View-Code zu definieren, den Sie zu Beginn des Renderns jeder Ansicht ausführen möchten. Zum Beispiel, Wir könnten Code in unsere _ViewStart.cshtml-Datei in .__ schreiben. Legen Sie die Layout-Eigenschaft für jede Ansicht programmgesteuert als .__ fest. SiteLayout.cshtml-Datei standardmäßig:

Da dieser Code zu Beginn jeder Ansicht ausgeführt wird, werden wir nicht mehr Sie müssen das Layout in einer unserer einzelnen Ansichtsdateien explizit festlegen (außer wenn wir den Standardwert oben überschreiben wollten).

Wichtig: Da wir mit _ViewStart.cshtml Code schreiben können, müssen wir kann optional unsere Layout-Auswahllogik reicher machen als nur eine grundlegende Eigenschaftssatz. Zum Beispiel: Wir können die Layoutvorlage ändern die wir verwenden, abhängig davon, welcher Gerätetyp auf die Site zugreift -- und haben für diese Geräte ein für Ihr Telefon oder Tablet optimiertes Layout und ein Desktop-optimiertes Layout für PCs/Laptops. Oder wenn wir eine .__ bauten. CMS-System oder gemeinsame freigegebene Anwendung, die von mehreren Kunden verwendet wird Je nach Kunde (oder deren Rolle) können wir beim Zugriff auf die Website unterschiedliche Layouts auswählen.

Dies ermöglicht eine große Flexibilität der Benutzeroberfläche. Es erlaubt Ihnen auch mehr schreiben Sie einfach die Ansichtslogik einmal und vermeiden Sie es, sie in mehreren setzt.

Siehe auch this .

218
jim tollan

In einem allgemeineren Sinn wird diese Fähigkeit des MVC-Frameworks, _Viewstart.cshtml zu "kennen", als "Coding by convention" bezeichnet.

Konvention über Konfiguration (auch Konvention genannt) ist ein Software-Design-Paradigma, das die Zahl von .__ verringern soll. Entscheidungen, die Entwickler treffen müssen, gewinnen an Einfachheit, aber nicht zwangsläufig an Flexibilität verlieren. Der Ausdruck bedeutet im Wesentlichen ein Der Entwickler muss nur unkonventionelle Aspekte von .__ angeben. Anwendung. Befindet sich zum Beispiel eine Klasse Sale im Modell, wird die Die entsprechende Tabelle in der Datenbank wird standardmäßig als "Verkauf" bezeichnet. Es ist nur, wenn man von dieser Konvention abweicht, zB das .__ aufrufen. Tabelle “products_sold”, die man dazu schreiben muss Namen.

Wikipedia

Es gibt keine Magie. Es wurde gerade in die Kerncodebase des MVC-Frameworks geschrieben und ist daher etwas, was MVC "kennt". Deshalb finden Sie es nicht in den .config-Dateien oder anderswo. Es ist tatsächlich im MVC-Code. Sie können diese Konventionen jedoch überschreiben, um sie zu ändern oder zu löschen. 

31
rism

Nur ein weiterer Gedanke.

Wenn Sie eine eigene cshtml-Datei als allgemeine Vorlage verwenden möchten, können Sie dies auf diese Weise tun

In Ihrem _viewstart.cshtml können Sie Ihre übliche cshtml-Datei angeben.

@{Layout = "~/Views/Shared/_Layout.cshtml";}
21
user2515392

Der Quellcode ist ein viel besserer Ort, um danach zu suchen als in der Dokumentation.

Unter Bezugnahme auf den MVC 6-Code von Github haben wir einige interessante Dateien

----aktualisieren----

Aufgrund von Änderungen in der Quellstruktur finden Sie die Informationen zum Erfassen von Viewstart-Seiten jetzt in RazorViewEngine.cs und suchen nach der Funktion "GetViewStartPages".

----/aktualisieren----

Um zu antworten, wie sie ins Spiel kommen, schauen Sie sich RazorView an, das meiner Meinung nach (wegen IView) an die MVC-Pipeline gebunden ist. Diese Datei verfügt über eine RenderAsync-Methode, die von der MVC-Pipeline zum Rendern der angeforderten Ansicht aufgerufen wird. 

RenderAsync ruft RenderPage auf UND DANN RenderLayout (NOTE THE ORDER) ..__ Die RenderPage ruft zuerst Aufrufe für Viewstart-Dateien auf (beachten Sie Plural, es könnten mehrere _viewstart-Dateien vorhanden sein). 

Die gesuchten Informationen können Sie daher von der RenderViewStartAsync-Funktion in der Datei RazorView.cs unter dem Namespace Microsoft.AspNet.Mvc.Razor erhalten.

12

Dies kann jetzt einige zusätzliche Informationen zu dieser Frage hinzufügen (2016 auch MVC4, MVC5). 

Die Razor-Engine findet den Code in _ViewStart.cshtml und führt ihn aus, bevor ein anderer Code in demselben Verzeichnis oder Unterverzeichnis liegt, in dem _ViewStart.cshtml gefunden wird.

Jede Ansicht kann die Layout - Eigenschaft oder einen ihrer Werte überschreiben.

4
raddevus

Wenn Sie ein gemeinsames Layout für Ihre Seiten haben möchten, müssen Sie das allgemeine Layout definieren. Wenn Sie eine Ansicht mit einem Layout verknüpfen möchten, müssen Sie die Layout-Eigenschaft für jede Ansicht festlegen. Dies verstößt gegen das DRY-Prinzip (Don't Repeat Yourself). Für dieses .Net Framework wurde die Datei "_ViewStart.cshtml" bereitgestellt, die sich im Ansichtsordner ..__ befindet. Wir legen die Layoutinformationen in der Datei "_ViewStart.cshtml" ab, und standardmäßig verwenden alle Ansichten diese Layoutinformationen. Wenn Sie verschiedene Layout-Informationen angeben möchten, nehmen Sie an, dass Sie in Ihrer Startansicht eine neue "_ViewStart.cshtml" mit Bezug auf dieses Layout erstellen und im Ordner "Startansicht" ablegen.

1
KamalDeep

Die kurze Antwort lautet : ViewStarts werden zuerst gestartet, wenn eine Ansicht gerendert wird. Die lange Geschichte ist unten:

Die Geschichte der Erstellung einer einzelnen Ansichtsdatei:

  1. Der ViewStart wird mit ViewImports zusammengeführt und dann als einzelne Datei ausgeführt. Beachten Sie, dass ViewImports immer mit jeder cshtml-Datei einschließlich der ViewStart-Datei zusammengeführt wird. Sein Zweck ist die Abstraktion von @ -Anweisungen und anderen allgemeinen Anweisungen.
  2. Die Ausgabe von ViewStart (z. B. Layout und ViewData) steht der jeweiligen View-Datei zur Verfügung. 
  3. Wenn die Layout-Variable in der Ansichtsdatei den Wert null hat/wird, wird der Hauptteil der Ansicht gerendert und die endgültige Ausgabe wird an den Benutzer übergeben. 
  4. Wenn die Layout-Variable nicht Null ist/wird, wird die Ausführung in die Layoutdatei verschoben, die wiederum mit ViewImports als einzelne Datei zusammengefügt wird. Anschließend wird die Ausführung der Layoutdatei in der @RenderBody () - Anweisung in die Ansichtsdatei verschoben Dies wird erneut mit ViewImports zusammengeführt, und die Ausgabe wird an der Position von @RenderBody () mit der Layoutdatei zusammengeführt. Die endgültige Ausgabe wird schließlich an den Benutzer übergeben.

Hoffen Sie, dass Sie dadurch wissen, was in den unbekannten Geheimnissen des Lebenszyklus Ihres Programms wirklich vorgeht.

0
Shadi Namrouti