По умолчанию раздел в представлении "Бритва"
Вот ситуация, которую я пытаюсь решить:
У меня есть общий общий макет с одним разделом @RenderSection ( "Меню" ), который я хочу по умолчанию использовать стандартное меню для большинства моих страниц, но я хотел бы заменить/переопределить этот раздел в нескольких подписях страницы. Возможно ли это с помощью Razor на этом этапе игры?
Я надеялся, что могу определить реализацию по умолчанию этого раздела в _ViewStart.cshtml, но ему это не похоже.
Будет ли улучшенный вариант меню в частичной ситуации?
Edit:
Теперь я получаю следующую ошибку с этим кодом: Определены следующие разделы, но не были отображены для страницы макета "~/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>
}
Ответы
Ответ 1
А... Я возился с этим и обнаружил, что могу это сделать, просто переключая логику:
@RenderSection("Header", false)
@if (!IsSectionDefined("Header")) {
<header>
Default Header!
</header>
}
Поэтому, если мои страницы не определяют @section Header { ... }
, он отображает значение по умолчанию.
Ответ 2
Метод 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
Ответ 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
сам.