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 ...
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 .
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.
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";}
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.
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.
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.
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:
Hoffen Sie, dass Sie dadurch wissen, was in den unbekannten Geheimnissen des Lebenszyklus Ihres Programms wirklich vorgeht.