状況を調べることでこれを明確にしてみましょう。
@renderSection("Header")
@using (var context = SetUpSomeContext()) {
<div>
Some content here
@RenderBody();
</div>
}
@renderSection("Footer")
私たちは、剃刀があなたが期待する順序でページを実行すると仮定しています。私たちのようなビューを宣言すればどうなりますか?
が が
は、そのビューが@RenderBody()それが何のためにレイアウトページをレンダリングすることを推測するだろう.Alsoを実行するまで、レイアウト・ページを必要とし、これはないだろうかカミソリが任意のアイデアを持っていないでしょうreasonable.Soこれは
@{
Layout = null;
}
<div>@SomethingThatDependsOnContextBeingSetUp()</div>
実際に何が起こるかではない。
リクエストがあったとき、Razorが最初にあなたの視界の本体を実行するのはとても自然です。 私のデモRazorのようなレイアウトが指定されていない場合は、そのページの出力をレンダリングして停止します。ビューの実行後に コードのようにレイアウトが指定されている場合、レイアウトページに制御が渡されます。上から下にレンダリング)レイアウトページの残りの部分はコンテンツ配置のみです。@RenderBody()が表示されると、既に実行されているビューの出力が配置されます。
セクションの場合;ビューボディが実行されたときには実行されません。ビューがレイアウトページにコントロールを渡した後、レイアウトページは宣言された順序でセクションの実行を明示的に呼び出します。
はまた、あなたがあなたのビュー本体でページのタイトルを指定していることがわかり、ビュー本体で宣言されているすべての変数がで利用可能なレイアウトのタイトルタグ(ViewBag.Title) .After実行ビュー本体でレンダリングされますレイアウトページ。
合計:表示順序は上から下ですが、実行順序は異なります。あなたの状況については
:"SomethingThatDependsOnContextBeingSetUpはSetUpSomeContext前に実行され、失敗した"を。私はレイザー実行サイクルの自然な振る舞いだと言ったように、ビューのボディはレイアウトページが実行される前に実行されました。 セクションを作成するとき;ビュー本体は、最初に実行が、レイアウトpage.View本体を上から下へのレンダリングを開始し、それが@RenderSectionが、この場合のsection.Soの実行を呼び出す見ればSetUpSomeContextが実行されたレイアウトページとレイアウトページに制御を渡す前に、セクションは実行されませんSomethingThatDependsOnContextBeingSetUpが実行される前に
私の答えは何を解決するために残っている、この動作を説明しますか? – MstfAsan