Pozwolę sobie wyjaśnić to przez zbadanie sytuacji, Załóżmy, że masz widok podobny;
@renderSection("Header")
@using (var context = SetUpSomeContext()) {
<div>
Some content here
@RenderBody();
</div>
}
@renderSection("Footer")
Zakładamy, że brzytwa wykonuje stronę w kolejności, jakiej się spodziewasz, co by się stało, gdybyśmy ogłosili nasz widok?
@{
Layout = null;
}
<div>@SomethingThatDependsOnContextBeingSetUp()</div>
Razor nie mają pojęcia, czy widok potrzebuje układ strony aż do wykonywania @RenderBody() .Również byłoby wywnioskować, że układ strony renderowane za nic, a to nie byłoby to reasonable.So nie, co tak naprawdę się dzieje.
Na żądanie jest tak naturalne, że Razor najpierw wykonuje ciało twojego widoku. Jeśli twój widok nie jest określony, jak w moim demo Razor renderuje tylko wydruk tej strony i zatrzymuje się tam. Jeśli widok ma układ określony w kodzie po przejściu do widoku, przekazuje kontrolę do strony układu. (Strona układu zaczyna się renderowanie od góry do dołu) Pozostaje więc na stronie Układu tylko umieszczanie treści. Kiedy zobaczy @RenderBody(), umieszcza tylko wynik twojego już wykonanego widoku.
Dla sekcji; nie są wykonywane po wykonaniu treści widoku, po przejściu widoku na stronę układu, strona układu jawnie wywołuje wykonanie sekcji w kolejności, w jakiej zostały zadeklarowane.
również zauważyć, że określasz swój tytuł strony w organizmie widok i to jest renderowany w układzie tagu tytułu (ViewBag.Title) .Po widok roli organu wszystkie zmienne, które są zadeklarowane w widoku ciała są dostępne w strona układu.
Suma: kolejność renderowania jest od góry do dołu, ale kolejność wykonywania jest inna.
do sytuacji: "SomethingThatDependsOnContextBeingSetUp wykonuje przed SetUpSomeContext a nie". Tak jak powiedziałem, że jest to naturalne zachowanie cyklu wykonywania maszynki Razor, zobacz treść wykonaną przed wykonaniem strony układu. Po utworzeniu sekcji; view body wykonywane najpierw, ale sekcje nie są wykonywane przed stroną layout.View body przekazuje kontrolę do strony layoutu, a strona Layout zaczyna renderować od góry do dołu i jeśli widzi @RenderSection, wywołuje wykonanie sekcji.So w tym przypadku wykonywany jest SetUpSomeContext przed wykonaniem SomethingThatDependsOnContextBeingSetUp.
Moja odpowiedź wyjaśnia to zachowanie, co pozostało do rozwiązania? – MstfAsan