Почему моя .cshtml-страница должна определять контент?

Скажем, у меня есть следующая структура в моем приложении ASP.NET MVC 3.

  • Элементы
    • Index.cshtml
  • Категория
  • Общий
    • _Index.cshtml
    • _Site.cshtml
    • Index.cshtml

Оба файла Index.cshtml используют _Index.cshtml, так как страница макета и _Index вложены в макет _Site.

Items/Index реализует необязательные разделы, определенные в _Index. Shared/Index пусто.

Режим Items/Index отлично работает. Так как Категории не имеют индекса, он использует тот, который находится в общей папке. Это не работает.

Он выдает ошибку

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

Если _Site вызывает RenderBody, а _Index наследует от _Site, не соответствует ли содержимое в _Index требуемому вызову RenderBody, а Shared/Index.cshtml может быть пустым?

Причина, по которой я спрашиваю, заключается в том, что у меня есть приложение ASP.NET MVC 1, которое реализовало эту структуру с использованием мастер-страниц, и она отлично работала, но преобразование ее в MVC 3 с помощью Razor вызывает эту проблему.

Вот основные сведения о том, что я описываю:

_Site.cshtml

<!DOCTYPE html>
// head
<body>
  @RenderBody()
</body>

_Index.cshtml

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

<div id="sub-menu">
  // Markup
</div>

// More markup

@RenderSection("SectionOne", required: false)

@RenderSection("SectionTwo", required: false)

Items/Index.cshtml(рабочий)

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

@section SectionOne {
  // Markup
}

Shared/Index.cshtml(ошибка RenderBody)

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

// Rest of this file is empty

Ответ 1

Я не уверен, что полностью следую за вами, но для всех страниц макета должен быть RenderBody(), даже если они вложены. RenderBody() отображает содержимое для "ребенка". Когда у вас есть вложенные страницы макета, вложенный макет - это дочерний элемент родителя, и его вывод должен отображаться в RenderBody. Аналогично, ребенок ребенка должен отображать его тело на среднюю страницу.

Другими словами, все, что не в @section, считается "телом". Итак, _Index.cshtml должен отобразить его body (Index.cshtml) и _Site.html, чтобы отобразить его body (_Index.cshtml). Он поднимается по цепочке.

ИЗМЕНИТЬ:

Кажется, что макет должен отображать хотя бы один раздел, будь то RenderBody() или RenderSection(). Хотя может быть правдой, что разделы являются необязательными, рендеринг хотя бы одного раздела не является. Либо добавьте пустой раздел в свой Index.cshtml, либо добавьте RenderBody() в свой _Index.cshtml.