ASP.NET MVC中的继承布局

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)

要记住以下几点:

  1. 子布局的内容将放置在@RenderBody基本布局中的位置,就像视图的内容一样.您的子布局仍然需要自己@RenderBody来确定应该放置利用它的视图的内容.

  2. 必须在子布局中实现在基本布局中定义为必需的任何部分,否则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)
  3. 如果您的视图需要能够实现一个部分(必需或不需要),则子布局必须定义它.例如,在上面的代码中,任何使用的视图_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/