这是我要解决的情况:

我有一个主要共享布局,其中一个部分@rendersection(“菜单”)我想默认到我大多数页面的标准菜单,但是我想在几个子页面中替换/覆盖该部分。在游戏中的这个阶段,Razor是否可以使用?

我希望我可以在_viewstart.cshtml中定义该部分的默认实现,但似乎不喜欢它。

菜单部分视图在这种情况下会更好吗?

编辑:

我现在在此代码中遇到以下错误:已定义了以下部分,但没有针对布局页面“〜/view/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 我。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top