为什么我的剃刀'RenderSection'不会被孙子视图继承?



我正在使用 Razor 视图层次结构设置我的 ASP.NET Core 站点,如下所示:

_Layout
_PanelLayout
Index

所以,我有这些文件:


_ViewStart.cshtml

@{
Layout = "_PanelLayout";
}

_PanelLayout.cshtml

@{
Layout = "_Layout";
}
<div>Panel layout file</div>
@RenderBody()

_Layout.cshtml

<html><body>
<div>Main layout file</div>
@RenderBody()
@RenderSection("scripts", required: false)
</body></html>

Index.cshtml

@section scripts {
<script>
// test script
</script>
}
<div>Content view</div>

当我运行返回Index视图的控制器操作时,出现错误:

InvalidOperationException:以下部分已定义,但尚未由"_PanelLayout.cshtml"中的页面呈现:"脚本"。

为什么 Razor 没有发现 Index 的祖父视图正在渲染"脚本"部分的事实? 如果我删除该部分,布局工作正常,因此唯一的问题是此部分渲染没有延续到祖父布局。 有没有解决这个问题的方法,仍然允许我决定要在祖父布局("_Layout"(而不是父布局("_PanelLayout"(上呈现"脚本"部分的位置?

父布局中的任何部分都必须在子布局中重新定义,否则它们将无法在继承链的下游使用。换句话说,在_PanelLayout.cshtml中,您需要添加:

@section scripts
{
@RenderSection("scripts", required: false)
}
这为引用此布局(RenderSection

(的下一级布局或视图提供了钩子,然后将其输出填充到_Layout.cshtml部分中。

最新更新