C# 为什么我的剃须刀';渲染部分';不被孙辈视图继承?
我正在使用Razor视图的层次结构设置我的ASP.NET核心站点,如下所示:C# 为什么我的剃须刀';渲染部分';不被孙辈视图继承?,c#,asp.net-mvc,asp.net-core,razor,templating,C#,Asp.net Mvc,Asp.net Core,Razor,Templating,我正在使用Razor视图的层次结构设置我的ASP.NET核心站点,如下所示: _Layout _PanelLayout Index 所以,我有这些文件: \u ViewStart.cshtml @{ Layout = "_PanelLayout"; } @{ Layout = "_Layout"; } <div>Panel layout file</div> @RenderBody() <html><bod
_Layout
_PanelLayout
Index
所以,我有这些文件:
\u ViewStart.cshtml
@{
Layout = "_PanelLayout";
}
@{
Layout = "_Layout";
}
<div>Panel layout file</div>
@RenderBody()
<html><body>
<div>Main layout file</div>
@RenderBody()
@RenderSection("scripts", required: false)
</body></html>
@section scripts {
<script>
// test script
</script>
}
<div>Content view</div>
\u PanelLayout.cshtml
@{
Layout = "_PanelLayout";
}
@{
Layout = "_Layout";
}
<div>Panel layout file</div>
@RenderBody()
<html><body>
<div>Main layout file</div>
@RenderBody()
@RenderSection("scripts", required: false)
</body></html>
@section scripts {
<script>
// test script
</script>
}
<div>Content view</div>
@{
布局=“_布局”;
}
面板布局文件
@RenderBody()
\u Layout.cshtml
@{
Layout = "_PanelLayout";
}
@{
Layout = "_Layout";
}
<div>Panel layout file</div>
@RenderBody()
<html><body>
<div>Main layout file</div>
@RenderBody()
@RenderSection("scripts", required: false)
</body></html>
@section scripts {
<script>
// test script
</script>
}
<div>Content view</div>
主布局文件
@RenderBody()
@RenderSection(“脚本”,必需:false)
Index.cshtml
@{
Layout = "_PanelLayout";
}
@{
Layout = "_Layout";
}
<div>Panel layout file</div>
@RenderBody()
<html><body>
<div>Main layout file</div>
@RenderBody()
@RenderSection("scripts", required: false)
</body></html>
@section scripts {
<script>
// test script
</script>
}
<div>Content view</div>
@节脚本{
//测试脚本
}
内容视图
当我运行返回
索引
视图的控制器操作时,我得到错误:
InvalidOperationException:以下部分已定义,但尚未由“\u PanelLayout.cshtml”页面呈现:“脚本”
为什么Razor没有发现索引的祖父母视图正在呈现一个“脚本”部分?如果删除该部分,则布局工作正常,因此唯一的问题是该部分渲染没有执行到祖辈布局。是否有一种解决方案仍然允许我决定在祖父母版面(“U版面”)而不是父版面(“U PanelLayout”)上渲染“脚本”部分的位置?父版面中的任何部分都必须在子版面中重新定义,否则它们将无法在继承链的更下游使用。换句话说,在
\u PanelLayout.cshtml
中,您需要添加:
@section scripts
{
@RenderSection("scripts", required: false)
}
这提供了一个钩子,指向引用此布局的下一级布局或视图(
RenderSection
),然后将该布局的输出填充到\u layout.cshtml
中的部分中。奇怪的是,我在周五遇到了这个问题。迫不及待地想看看它是如何解决的,这样我就可以正确地使用我的布局页面了。你应该检查一下这个问题,看看它是否有帮助。是的,我试过了,它成功了。但我还是不明白为什么剃须刀引擎不能自动完成。这是直观的,不一定。其工作方式是,视图仅查看由其引用的布局直接定义的截面。这个设置允许您隐藏中间部分,实际上我已经使用过很多次了。比如说,我想允许子布局修改页面的某个特定区域,但我不想允许视图修改。我只是没有在子布局中重新定义该部分。它实际上给了你很多力量。