1. ホーム
  2. asp.net-mvc-3

[解決済み] Razor ネストレイアウトとカスケードセクション

2023-07-21 19:47:10

質問

Razorをビューエンジンとして使用したMVC3サイトを持っています。 私は私のサイトがスキン可能であることを望みます。 可能なスキンのほとんどは、共有マスターレイアウトから派生することができるほど十分に類似しています。

したがって、私はこのデザインを検討しています。

しかし、私は、このような場合にも RenderSection を下のレイヤーで呼び出したい。 _Common.cshtml で、上のレイヤーで定義されたセクションをレンダリングさせる。 Detail.cshtml . これはうまくいきません。 RenderSection は、明らかに次のレイヤーで定義されているセクションのみをレンダリングします。

もちろん、各スキンで各セクションを定義することはできます。 例えば、もし _Common を呼び出す必要がある場合 RenderSection("hd") で定義されたセクションに対して Detail で定義されたセクションのために、私はただこれをそれぞれの _Skin に配置するだけで、うまくいきます。

@section hd {
    @RenderSection("hd")
}

この結果、コードが重複してしまい(各スキンに同じセクションが必要なため)、全体的に雑然とした感じがします。私はまだRazorの初心者ですが、何か明らかなことを見逃しているような気がします。

デバッグするとき、私は WebViewPage.SectionWritersStack で定義されたセクションの完全なリストを見ることができます。 もし私が RenderSection に、あきらめる前にリスト全体を調べるように言うことができれば、必要なセクションを見つけることができるでしょう。 残念なことに、SectionWritersStackは非公開です。

代わりに、もし私がレイアウトページの階層にアクセスし、それぞれの異なるコンテキストで RenderSection の実行を試みることができれば、私が必要とするセクションを見つけることができます。おそらく何かを見逃しているのでしょうが、これを行う方法は見当たりません。

私がすでに概説した方法以外に、この目標を達成する方法はあるでしょうか。

どのように解決するのですか?

これは実際、パブリックAPIを使用して今日可能ではありません(セクションの再定義のアプローチを使用する以外には)。プライベート リフレクションを使用すれば運よくできるかもしれませんが、もちろんそれは壊れやすいアプローチです。私たちは、Razorの次のバージョンでこのシナリオをより簡単にすることを検討します。

とりあえず、このテーマについて書いたブログ記事をいくつか紹介します。