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

Jez*_*Jez 3 c# asp.net-mvc templating razor asp.net-core

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

_Layout
    _PanelLayout
        Index
Run Code Online (Sandbox Code Playgroud)

所以,我有这些文件:


_ViewStart.cshtml

@{
    Layout = "_PanelLayout";
}
Run Code Online (Sandbox Code Playgroud)

_PanelLayout.cshtml

@{
    Layout = "_Layout";
}
<div>Panel layout file</div>
@RenderBody()
Run Code Online (Sandbox Code Playgroud)

_Layout.cshtml

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

索引.cshtml

@section scripts {
    <script>
        // test script
    </script>
}
<div>Content view</div>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Chr*_*att 8

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

@section scripts
{
    @RenderSection("scripts", required: false)
}
Run Code Online (Sandbox Code Playgroud)

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