以下是我要解决的问题:
我有一个主要的共享布局,只有一个部分@RenderSection(“菜单”),我想默认为我的大多数页面的标准菜单,但我想在几个子页面中替换/覆盖该部分页面。 Razor在游戏的这个阶段可以实现吗?
我希望我可以在_ViewStart.cshtml中定义该部分的默认实现,但它似乎不喜欢它。
对于这种情况,菜单部分视图会更好吗?
编辑:
我现在使用此代码收到以下错误:已定义以下部分,但尚未针对布局页面“〜/ Views / Shared / _Layout.cshtml”:“menu”进行渲染。
_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>
}
答案 0 :(得分:24)
啊......我正在弄乱这个,发现我可以通过切换逻辑来做到这一点:
@RenderSection("Header", false)
@if (!IsSectionDefined("Header")) {
<header>
Default Header!
</header>
}
因此,如果我的页面未定义@section Header { ... }
,则会呈现默认值。
答案 1 :(得分:19)
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
答案 2 :(得分:3)
我目前正在使用多种布局来实现这种完全相同的情况。
<强> /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
。