В MVC Razor, как вы делаете RenderSection, определенный ниже под-макета? - PullRequest
13 голосов
/ 29 сентября 2011

У меня есть _Layout.cshtml верхнего уровня, который выглядит примерно так:

<html>
<head>
    @RenderSection("Header", required: false)
</head>
<body>

    @RenderSection("LeftPane", required: false)
    @RenderSection("RightPane", required: false)
    @RenderBody()

</body>
</html>

Тогда у меня есть два «под-макета». Один определяет только раздел LeftPane, другой определяет как LeftPane, так и RightPane. Эти вложенные макеты называются _LeftPane.cshtml и _LeftPlusRightPane.cshtml, и для них задано значение «_Layout.cshtml».

Затем в каждом файле View .cshtml я устанавливаю макет либо _LeftPane.cshtml, либо _LeftPlusRightPane.cshtml, в зависимости от того, что я хочу показать на странице.

Это все отлично работает. Проблема в новом разделе «Заголовок», который я добавил в часть документа <head>. Этот раздел определен не в под-макетах, а в реальных представлениях. Когда я пытаюсь что-то посмотреть таким образом, я получаю сообщение об ошибке:

Следующие разделы были определены, но не были отображены для страницы макета "~ / Views / Shared / _LeftPlusRightPane.cshtml": "Header".

Я не хочу отображать раздел Заголовок в подуровнях, я хочу отобразить его в файле _Layout.cshtml. Как мне "пройти" через определенный раздел Заголовок из низкоуровневого представления, через под-макеты, до верхнего _Layout?

1 Ответ

25 голосов
/ 30 сентября 2011

Вы можете вкладывать макеты. Так что _Layout2 имеет Layout = "_Layout.cshtml";

Вы также можете использовать _ViewStart файлы в каждой из ваших подпапок View, чтобы указать другой макет по умолчанию для этой подпапки.

Чтобы «пройти» по разделу, вы просто делаете что-то вроде этого:

@section Header {@RenderSection("Header", false)}

Это позволяет передавать контент по цепочке.

...