Oto About.cshtml z domyślnego szablonu MVC 3:
@{
ViewBag.Title = "About Us";
}
<h2>About</h2>
<p>
Put content here.
</p>
Spodziewałbym się, że w pliku można znaleźć odwołanie do pliku _ViewStart About.cshtml
, ale najwyraźniej tak nie jest.
Szukałem w global.asax
a web.config
, ale nie mogę dowiedzieć się, w jaki sposób About.cshtml
plik jest „połączony” z układem z pliku _ViewStart.
Wszystko działa zgodnie z oczekiwaniami, chciałbym tylko wiedzieć, co się dzieje pod maską ...
ViewLocationFormats = ViewLocationFormats.Union(new string[] { "~/Inspinia/ExampleViews/{1}/{0}.cshtml" }).ToArray();
. W rezultacie musiałem dodać kopię mojego pliku _ViewStart.cshtml do „~ / Inspinia / ExampleViews”, w przeciwnym razie nie został on pobrany i nie został ustawiony żaden układ._ViewStart
w każdym podfolderze link do widoków w tym podfolderze?W bardziej ogólnym znaczeniu ta zdolność frameworka MVC do „wiedzieć” o _Viewstart.cshtml nazywa się „Kodowaniem według konwencji”.
Wikipedia
Nie ma w tym magii. Właśnie został zapisany w podstawowej bazie kodu frameworka MVC i dlatego jest czymś, o czym MVC „wie”. Dlatego nie znajdziesz go w plikach .config lub gdzie indziej; jest w rzeczywistości w kodzie MVC. Możesz jednak zastąpić te konwencje lub je anulować.
źródło
Kolejna myśl.
Jeśli chcesz mieć własny
cshtml
plik jako wspólny szablon, możesz to zrobić w ten sposóbW swoim
_viewstart.cshtml
można wymienić swój wspólnycshtml
plik.źródło
Kod źródłowy jest znacznie lepszym miejscem do poszukiwania tego niż dokumentacja.
Odwołując się do kodu MVC 6 z Github, mamy kilka interesujących plików
----aktualizacja----
Ze względu na zmiany struktury źródła informacje o tym, jak gromadzone są strony podglądu, można teraz znaleźć w RazorViewEngine.cs szukać funkcji „GetViewStartPages”.
----/aktualizacja----
Aby odpowiedzieć na pytanie, w jaki sposób wchodzą w grę, spójrz na RazorView , który moim zdaniem (z powodu IView) jest powiązany z potokiem MVC. Ten plik ma metodę RenderAsync, która jest wywoływana z potoku MVC w celu renderowania żądanego widoku.
RenderAsync wykonuje połączenia z RenderPage, a następnie RenderLayout (UWAGA ZAMÓWIENIE). RenderPage najpierw wykonuje wywołania w celu obsługi plików viewstart (uwaga w liczbie mnogiej, może istnieć więcej niż jeden plik _viewstart).
Tak więc informacje, których szukasz, można uzyskać z funkcji RenderViewStartAsync w pliku RazorView.cs w obszarze nazw Microsoft.AspNet.Mvc.Razor.
źródło
To może teraz dodać dodatkowe informacje do tego pytania (2016 ala MVC4, MVC5).
Silnik Razor znajduje i uruchamia kod w _ViewStart.cshtml przed każdym innym kodem, który znajduje się w tym samym katalogu lub podkatalogu, w którym znajduje się _ViewStart.cshtml .
Każdy widok może zastąpić właściwość Układ lub dowolną jej wartość.
Pomyślałem, że mogę dodać trochę więcej informacji, aby pokazać, dlaczego jest to _ViewStart.
Jeśli otrzymasz ILSpy i sprawdzisz kod w RazorViewEngine (System.Web.Mvc.dll), zobaczysz, że sam kod odwołuje się do tej nazwy.
Możesz zobaczyć, że RazorViewEngine szuka pliku o tej nazwie:
źródło
Jeśli chcesz mieć wspólny układ dla swoich stron, musisz zdefiniować wspólny układ i powiązać widok z układem, musimy ustawić właściwość układu dla każdego widoku, co narusza zasadę DRY (Don't Repeat Yourself). Do tego .NET Framework udostępnia plik „_ViewStart.cshtml”, umieszczony w folderze widoku. Umieszczamy informacje o układzie w pliku „_ViewStart.cshtml” i każdy widok domyślnie korzysta z tych informacji o układzie. Jeśli chcesz podać inne informacje o układzie, załóżmy, że w widoku głównym możesz utworzyć nowy plik „_ViewStart.cshtml” w odniesieniu do tego układu i umieścić go w folderze „Widok główny”.
źródło
Krótka odpowiedź brzmi : ViewStarts zaczyna się najpierw, gdy renderowany jest dowolny widok. Długa historia jest poniżej:
Historia tworzenia jednego pliku widoku:
Mam nadzieję, że dzięki temu zdasz sobie sprawę z tego, co naprawdę dzieje się w nieznanych tajemnicach cyklu życia Twojego programu.
źródło