Tom*_*bes 12 asp.net-mvc layout nested
我有大多数页面的默认布局_Layout.cshtml.但是对于某些页面组,我希望稍微修改一下默认布局.我知道我可以将该文件复制一下,但这意味着复制代码并维护两个布局,99%的代码相同.
我想继承默认的布局,如下所示:
LayoutInherited.cshtml:
Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.BodyContentClassSpecial = "";
@section header{
<style>
#body-content {
width: 90%;
margin: 0 auto;
}
</style>
Run Code Online (Sandbox Code Playgroud)
}
可以这样做吗?
Chr*_*att 26
是的,布局继承是可能的.从本质上讲,您只是创建一个本身使用布局的布局,因为布局只是视图,没有问题.
你完全按照你所描述的那样做:
_SubLayout.cshtml
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@RenderBody()
Run Code Online (Sandbox Code Playgroud)
要记住以下几点:
子布局的内容将放置在@RenderBody基本布局中的位置,就像视图的内容一样.您的子布局仍然需要自己@RenderBody来确定应该放置利用它的视图的内容.
必须在子布局中实现在基本布局中定义为必需的任何部分,否则Razor将引发异常,就像您的视图未实现该部分一样.例如:
_Layout.cshtml
@RenderSection("Foo", required: true)
Run Code Online (Sandbox Code Playgroud)
_SubLayout.cshtml
@section Foo
{
<p>Foo</p>
}
Run Code Online (Sandbox Code Playgroud)如果您的视图需要能够实现一个部分(必需或不需要),则子布局必须定义它.例如,在上面的代码中,任何使用的视图_SubLayout.cshtml都无法定义Foo节,因为它将不再存在.如果你尝试过,会引发异常.为了允许该视图定义该部分,您必须执行以下操作:
_SubLayout.cshtml
@section Foo
{
@RenderSection("Foo", required: true)
}
Run Code Online (Sandbox Code Playgroud)
这定义了用于基本布局的部分,然后允许该部分由使用此子布局的任何视图定义.
在我的博客上实际上有一篇文章,如果你需要的话,可以更详细地介绍所有这些:http://cpratt.co/how-to-change-the-default-asp-net-mvc-themet/