Почему моя страница .cshtml должна определять содержимое? - PullRequest
11 голосов
/ 18 ноября 2011

Допустим, у меня есть следующая структура в приложении 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 Ответ

11 голосов
/ 18 ноября 2011

Я не уверен, что полностью следую за вами, но ALL страницы макета должны иметь RenderBody(), даже если они вложенные. RenderBody() рендеринг контента для «ребенка». Если у вас есть вложенные страницы макета, вложенный макет является дочерним по отношению к родительскому элементу, и его выходные данные должны отображаться в RenderBody. Точно так же ребенок ребенка должен отобразить свое тело на средней странице.

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

РЕДАКТИРОВАТЬ:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...