Вложенные макеты для 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);

Если параметр "обязательный" раздела является ложным, он не даст ошибку, если этот раздел не включен в представление.