在Razor视图中默认部分

Ric*_*rds 18 asp.net-mvc razor

这是我想要解决的情况:

我有一个主要的共享布局,单个部分@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>
Run Code Online (Sandbox Code Playgroud)

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>
    }
Run Code Online (Sandbox Code Playgroud)

And*_*ugh 25

啊......我搞砸了这个,发现我可以通过切换逻辑来做到这一点:

@RenderSection("Header", false)
@if (!IsSectionDefined("Header")) { 
<header>
    Default Header!
</header>
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我的页面没有定义@section Header { ... },它将呈现默认值.


mar*_*ind 20

IsSectionDefined方法应该满足您的需求:

@if(IsSectionDefined("Menu")) {
    @RenderSection("Menu")
} else {
    <text>
        Default Menu Content.
    </text>
}
Run Code Online (Sandbox Code Playgroud)

更新:我写了一篇博文来更好地说明可用的选项:http://blogs.msdn.com/b/marcinon/archive/2010/12/08/Optional-Razor-Sections-with-Default-Content.aspx

  • 我更新了代码以解决问题.你需要做`@RenderSection()`而不只是'RenderSection()` (2认同)