Вложенные макеты для MVC5
Я видел несколько сообщений по этой теме:
Вложенные макеты Razor с каскадными разделами
MVC 3 - Вложенные макеты - разделы не отображаются в областях
И это всегда кажется проблематичным. Однако они оба довольно старые, поэтому задаются вопросом, изменились ли вещи.
В основном у меня есть макет макета и 3 разных шаблона тела, основанных на том, какая именно страница. Для примера:
_Layout.cshtml
<html lang="en">
<head>
</head>
<body style="padding: 50px 0;">
<header class="navbar navbar-default navbar-fixed-top" role="banner">
@Html.Partial("_MenuPartial")
</header>
<ol class="breadcrumbs">
@RenderSection("breadcrumbs", true);
</ol>
<section>
@RenderBody();
</section>
<footer class="navbar navbar-default navbar-fixed-bottom">
@Html.Partial("_FooterPartial")
</footer>
@Html.Partial("_ScriptInitPartial")
</body>
</html>
_LayoutForEdit.cshtml
<div class="panel panel-primary">
<div class="panel-body">
<div class="col-lg-2">
<ul class="nav nav-pills nav-stacked">
@RenderSection("tabs", true)
</ul>
</div>
<div class="col-lg-10">
<div class="tab-content">
@RenderBody()
</div>
</div>
</div>
<div class="panel-footer">
<button class="btn btn-primary" data-bind="enable: Entity.isValid, click: save">Save</button>
</div>
</div>
Теперь это делает штраф при вызове. Почти.
Отрисовка разделов должна быть в дочернем макете. Если я попытаюсь поместить панировочные сундуки в _Layout.cshtml
, он будет терпеть неудачу, потому что _LayoutForEdit.cshtml
никогда не отображал его. Как я могу это исправить?
The following sections have been defined but have not been rendered for the layout page "~/Views/Shared/_LayoutForEdit.cshtml": "breadcrumbs".
Ответы
Ответ 1
Я знаю, это старый вопрос. Я думал, что я поделюсь этим так или иначе, если кто-нибудь еще столкнется с этим (как и я).
В нижней части макета вашего ребенка вы определяете раздел с тем же именем, что и раздел родительского макета. Внутри этого раздела вы просто ставите @RenderSection
, снова указывая то же имя, что и раньше. Как только это будет установлено, вы по существу имеете дочерний макет "обход" со страниц, вплоть до его родительского макета:
@section breadcrumbs {
@RenderSection("breadcrumbs", true)
}
Ответ 2
Не уверен, что вам все равно нужна помощь, но я все равно отвечу.
В этом случае метод RenderSection принимает следующие параметры в соответствии с
Документация MSDN:
public HelperResult RenderSection(
string name,
bool required
)
Parameters
name
Type: System.String
The section to render.
required
Type: System.Boolean
true to specify that the section is required; otherwise, false.
Измените вызов на:
@RenderSection ( "панировочные сухари", false);
Если параметр "обязательный" раздела является ложным, он не даст ошибку, если этот раздел не включен в представление.