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

时间:2019-09-16 15:18:11

标签: c# asp.net-mvc asp.net-core razor templating

我正在使用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)上呈现“脚本”部分的位置?

1 个答案:

答案 0 :(得分:3)

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

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

这会钩住下一级布局或引用此布局(RenderSection)的视图,然后将其输出填充到_Layout.cshtml的部分中。