为什么我的 Razor 'RenderSection' 没有被孙视图继承?

Why does my Razor 'RenderSection' not get inherited by a grandchild view?

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

_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>

当我 运行 控制器操作 returns Index 视图时,我得到错误:

InvalidOperationException: The following sections have been defined but have not been rendered by the page at '_PanelLayout.cshtml': 'scripts'.

为什么 Razor 不接受 Index 的 grandparent 视图正在呈现 'scripts' 部分这一事实?如果我删除该部分,布局工作正常,所以唯一的问题是这个部分渲染没有执行到 grandparent 布局。有没有解决这个问题的方法,它仍然允许我决定在 grandparent 布局('_Layout')而不是 parent 布局(' _PanelLayout')?

父布局中的任何部分都必须在子布局中重新定义,否则它们在继承链的下游将不可用。也就是说,在_PanelLayout.cshtml中你需要添加:

@section scripts
{
    @RenderSection("scripts", required: false)
}

这为引用该布局 (RenderSection) 的下一级布局或视图提供了一个挂钩,然后将其输出填充到 _Layout.cshtml 中的部分。