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

C# 为什么我的.cshtml页面需要定义内容?,c#,asp.net-mvc-3,razor,C#,Asp.net Mvc 3,Razor,假设我的ASP.NET MVC 3应用程序具有以下结构 项目 Index.cshtml 类别 共享 _Index.cshtml _Site.cshtml Index.cshtml 两个Index.cshtml文件都使用\u Index.cshtml作为布局页面,\u Index嵌套在\u站点布局中 Items/Index实现了\u Index中定义的可选部分共享/索引为空 Items/Index视图工作正常。因为类别没有索引,所以它使用共享文件夹中的索引。这是行不通的 它抛出了错误

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

  • 项目
    • Index.cshtml
  • 类别
  • 共享
    • _Index.cshtml
    • _Site.cshtml
    • Index.cshtml
两个
Index.cshtml
文件都使用
\u Index.cshtml
作为布局页面,
\u Index
嵌套在
\u站点
布局中

Items/Index
实现了
\u Index
中定义的可选部分<代码>共享/索引为空

Items/Index
视图工作正常。因为类别没有索引,所以它使用共享文件夹中的索引。这是行不通的

它抛出了错误

尚未为布局页面“~/Views/Shared/\u Index.cshtml”调用“RenderBody”方法

如果
\u Site
调用
RenderBody
,并且
\u Index
继承自
\u Site
,那么
\u Index
中的内容是否满足所需的
RenderBody
调用,并且
共享/索引.cshtml
可以为空

我问这个问题的原因是因为我有一个ASP.NET MVC 1应用程序,它使用母版页实现了这种结构,并且运行良好,但是使用Razor将其转换为MVC 3会导致这个问题

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

_Site.cshtml

<!DOCTYPE html>
// head
<body>
  @RenderBody()
</body>
Shared/Index.cshtml(RenderBody错误)


我不确定我是否完全理解您的意思,但是所有布局页面都必须有一个
RenderBody()
,即使它们是嵌套的
RenderBody()
呈现“子对象”的内容。当您有嵌套布局页面时,嵌套布局是父级的子级,其输出必须在RenderBody中呈现。同样,子对象的子对象必须将其主体呈现到中间页面

换句话说,任何不在@section中的内容都被视为“body”。因此,_Index.cshtml需要呈现它的主体(Index.cshtml),而_Site.html必须呈现它的主体(_Index.cshtml)。它沿着链条上升

编辑:


布局似乎必须至少渲染一个部分,无论是使用
RenderBody()
还是
RenderSection()
。虽然分区可能是可选的,但至少渲染一个分区是不可选的。将空节添加到Index.cshtml或将RenderBody()添加到_Index.cshtml。

My _Index.cshtml不调用@RenderBody_索引只是实现了来自_站点的部分,并定义了一些新的部分。然后Item/Index实现了一些_索引部分。“就是这样。@Brandon-如果你包括一些基本的cshtml代码,也许会有所帮助,因为我不明白你在描述什么。更新的问题。”。也许我没有正确地实现嵌套页面,但这基本上就是它的结构。@Brandon-嗯,看起来必须至少有一个呈现的部分,无论是主体还是部分。您可以在其他索引中包含一个空部分。这就是我所做的。我只是想知道为什么在这种情况下我会被迫实现一个可选的部分。如果这仅仅是因为我没有身体,而它想要呈现一些东西,那么把它添加到你的答案中,我会接受的。谢谢
@{
    Layout = "~/Views/Shared/_Site.cshtml";
}

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

// More markup

@RenderSection("SectionOne", required: false)

@RenderSection("SectionTwo", required: false)
@{
    Layout = "~/Views/Shared/_Index.cshtml";
}

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

// Rest of this file is empty