RenderBody() и RenderSection() должны быть в каждом дочернем макете?

У меня есть три простых макета,

_Layout.cshtml (это базовый макет)

@RenderSection("something", required: false)
@RenderBody()

_Main.cshtml

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@section something {
   Hey I'm actually on the _Main layout.
}

Index.cshtml

@{
    Layout = "~/Views/Shared/_Main.cshtml";
}

Когда я пытаюсь отобразить представление индекса в действии, я получаю эту ошибку,

Метод «RenderBody» не вызывался для страницы макета «~/Views/Shared/_Main.cshtml».

Но подождите, у _Main.cshtml есть родительский макет, у которого уже есть RenderBody(). Так я ошибаюсь, должен ли я вызывать RenderBody() для каждого дочернего макета?


person Okan Kocyigit    schedule 19.08.2013    source источник
comment
@asymptoticFault, нет, это просто ошибка.   -  person Okan Kocyigit    schedule 20.08.2013
comment
Я не уверен, что вы можете использовать такие вложенные макеты.   -  person asymptoticFault    schedule 20.08.2013
comment
Да, вы можете вкладывать макеты. Обычно вы можете либо иметь разные страницы внутреннего макета, либо условно отображать содержимое в своем представлении.   -  person Raciel R.    schedule 20.08.2013
comment
Ок, сам не пробовал.   -  person asymptoticFault    schedule 20.08.2013
comment
Поскольку вы используете _Main.cshtml в качестве страницы макета, вам нужно добавить RenderBody()   -  person Cloud SME    schedule 20.08.2013


Ответы (4)


Да, RenderBody должен быть включен на каждую страницу макета, независимо от вложенности.

@RenderBody работает как заполнитель для движка, чтобы знать, куда переместить содержимое представления с помощью страницы макета.

person Raciel R.    schedule 19.08.2013

Этот код должен работать правильно:

_Layout.cshtml

@RenderSection("something", required: false)
@RenderBody()

_Main.cshtml

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
 }
@section something {
   Hey I'm actually on the _Main layout.
}

Index.cshtml

@{
    Layout = "~/Views/Shared/_Main.cshtml";
 }
<div id="Index Content Here">
 @RenderBody()
 </div>

index.cshtml должен отображаться, как показано ниже:

<head>
Hey I'm actually on the _Main layout.   
</head>
 <div id="Index Content Here">
</div>
</div>
person Girish Gupta    schedule 23.09.2014

Разделы можно сделать необязательными, отображая их с помощью required: false

@RenderSection("SectionName", required: false)
person Georg Patscheider    schedule 05.04.2016

Попробуйте включить раздел в последний просмотр.

@{
    Layout = "~/Views/Shared/_Main.cshtml";
}

@section something {
    content
}

ОБНОВЛЕНИЕ: Хорошо, я забыл сказать, что вам также нужно написать @RenderSection в макете _Main

@section something {
    Hey I'm actually on the _Main layout.
    @RenderSection("something", required:false)
}
enter code here
person chromigo    schedule 05.04.2016