質問
これが私が解決しようとしている状況です:
ページの大部分の標準メニューをデフォルトでデフォルトにしたい単一のセクション@RenderSection(「メニュー」)を使用したメインの共有レイアウトがありますが、そのセクションをいくつかのサブページに置き換え/オーバーライしたいと思います。これは、ゲームのこの段階でかみそりで可能ですか?
_viewstart.cshtmlでそのセクションのデフォルトの実装を定義できることを望んでいましたが、気に入らないようです。
メニューの部分的なビューは、この状況でより良いでしょうか?
編集:
このコードで次のエラーが発生しました。次のセクションが定義されていますが、レイアウトページ「〜/views/shared/_layout.cshtml」:「メニュー」でレンダリングされていません。
_layout.cshtml
<div id="menu">
@if (IsSectionDefined("menu"))
{
RenderSection("menu");
}
else {
<text>
<ul>
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li><a href="#">Lookups</a>
<ul>
@Html.ActionLink("Product","Index","Product")
</ul>
</li>
</ul>
</text>
}
</div>
index.cshtml
@section menu {
<ul>
<li>@Html.ActionLink("Product", "Index", "Product")</li>
<li>@Html.ActionLink("Form Type", "Index", "Product")</li>
<li>@Html.ActionLink("Supplier", "Index", "Product")</li>
</ul>
}
解決
ああ...私はこれをいじっていて、ロジックを切り替えるだけでそれができることに気付きました:
@RenderSection("Header", false)
@if (!IsSectionDefined("Header")) {
<header>
Default Header!
</header>
}
したがって、私のページが定義されていない場合 @section Header { ... }
, 、デフォルトをレンダリングします。
他のヒント
IsSectionDefined
メソッドはあなたのニーズに合う必要があります:
@if(IsSectionDefined("Menu")) {
@RenderSection("Menu")
} else {
<text>
Default Menu Content.
</text>
}
アップデート: :利用可能なオプションをよりよく説明するために、ブログ投稿を書きました。 http://blogs.msdn.com/b/marcinon/archive/2010/12/08/optional-razor-sections-with-default-content.aspx
現在、複数のレイアウトを使用して、まったく同じシナリオを実現しています。
/views/shared/_layout.cshtml
<html>
...
<body>
<div id="menu">@RenderSection("Menu", required:false)</div>
...
@RenderBody()
...
</body>
</html>
/views/shared/_layoutwithdefaultmenu.cshtml
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
@section Menu { @Html.Partial("Menu") }
@RenderBody()
/views/_viewstart.cshtml
@{ Layout = "~/Views/Shared/_LayoutWithDefaultMenu.cshtml"; }
これが意味することは、デフォルトでは、私のビューのすべてがデフォルトのメニューでレイアウトを取得することです。ただし、ビューごとに、レイアウトをに設定できます。 _Layout.cshtml
そして、実装します @section Menu
自分。