问题 为什么我的.cshtml页面需要定义内容?


假设我的ASP.NET MVC 3应用程序中有以下结构。

  • 项目
    • Index.cshtml
  • 分类
  • 共享
    • _Index.cshtml
    • _Site.cshtml
    • Index.cshtml

Index.cshtml 文件使用 _Index.cshtml 作为布局页面和 _Index 嵌套在 _Site 布局。

Items/Index 实现在中定义的可选部分 _IndexShared/Index 是空的。

Items/Index 视图工作正常。由于Categories没有索引,因此它使用Shared文件夹中的索引。这不起作用。

它抛出了错误

尚未针对布局页面“〜/ Views / Shared / _Index.cshtml”调用“RenderBody”方法。

如果 _Site 电话 RenderBody,和 _Index 继承自 _Site,不是内容 _Index 满足要求 RenderBody 打电话和 Shared/Index.cshtml 可以空白吗?

我问的原因是因为我有一个ASP.NET MVC 1应用程序,它使用母版页实现了这个结构,并且工作正常,但是使用Razor将其转换为MVC 3导致了这个问题。

以下是我所描述的基本概要:

_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

4134
2017-11-18 17:44


起源



答案:


我不确定我是否完全跟着你,但是 所有 布局页面必须有一个 RenderBody(),即使它们是嵌套的。 RenderBody() 呈现“孩子”的内容。当您具有嵌套布局页面时,嵌套布局是父级的子级,并且它的输出必须在RenderBody中呈现。同样,孩子的孩子必须将它的身体渲染到中间页面。

换句话说,任何不在@section中的东西都被认为是“身体”。因此,_Index.cshtml需要渲染它的主体(Index.cshtml),而_Site.html必须渲染它的主体(_Index.cshtml)。它上升了链。

编辑:

看来布局必须呈现至少一个部分,不管是否有 RenderBody() 或者a RenderSection()。虽然这些部分可能是可选的,但至少有一部分不是。在Index.cshtml中添加一个空部分或在_Index.cshtml中添加一个RenderBody()。


11
2017-11-18 17:50



我的_Index.cshtml虽然没有调用@RenderBody。 _Index只是实现_Site中的部分,并定义了一些新部分。然后Item / Index实现了一些_Index部分。而已。 - Brandon
@Brandon - 如果你包含一些基本的cshtml代码说明,也许会有所帮助,因为我只是不明白你在描述什么。 - Erik Funkenbusch
更新的问题。也许我没有正确实现嵌套页面,但这基本上就是它的结构。 - Brandon
@Brandon - 好吧,看起来必须至少有一个渲染部分,无论是身体还是部分。您可以在其他索引中包含空部分。 - Erik Funkenbusch
这就是我所做的。我只是想知道为什么在这种情况下我会被迫实施一个可选部分。如果只是因为我没有身体,并且想要渲染某些内容,请将其添加到您的答案中,我会接受。谢谢。 - Brandon


答案:


我不确定我是否完全跟着你,但是 所有 布局页面必须有一个 RenderBody(),即使它们是嵌套的。 RenderBody() 呈现“孩子”的内容。当您具有嵌套布局页面时,嵌套布局是父级的子级,并且它的输出必须在RenderBody中呈现。同样,孩子的孩子必须将它的身体渲染到中间页面。

换句话说,任何不在@section中的东西都被认为是“身体”。因此,_Index.cshtml需要渲染它的主体(Index.cshtml),而_Site.html必须渲染它的主体(_Index.cshtml)。它上升了链。

编辑:

看来布局必须呈现至少一个部分,不管是否有 RenderBody() 或者a RenderSection()。虽然这些部分可能是可选的,但至少有一部分不是。在Index.cshtml中添加一个空部分或在_Index.cshtml中添加一个RenderBody()。


11
2017-11-18 17:50



我的_Index.cshtml虽然没有调用@RenderBody。 _Index只是实现_Site中的部分,并定义了一些新部分。然后Item / Index实现了一些_Index部分。而已。 - Brandon
@Brandon - 如果你包含一些基本的cshtml代码说明,也许会有所帮助,因为我只是不明白你在描述什么。 - Erik Funkenbusch
更新的问题。也许我没有正确实现嵌套页面,但这基本上就是它的结构。 - Brandon
@Brandon - 好吧,看起来必须至少有一个渲染部分,无论是身体还是部分。您可以在其他索引中包含空部分。 - Erik Funkenbusch
这就是我所做的。我只是想知道为什么在这种情况下我会被迫实施一个可选部分。如果只是因为我没有身体,并且想要渲染某些内容,请将其添加到您的答案中,我会接受。谢谢。 - Brandon