asp.net-mvc - ASP.NET MVC 中的继承布局

标签 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>

}

可以做这样的事情吗?

最佳答案

是的,布局继承是可能的。本质上,您只是创建一个本身使用布局的布局,因为布局只是 View ,所以没有问题。

您几乎完全按照您的描述进行操作:

_SubLayout.cshtml

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@RenderBody()

需要记住的一些事情:

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

  2. 在基本布局中定义的任何部分必须在子布局中实现,否则 Razor 将引发异常,就像您的 View 未实现该部分一样。例如:

    _Layout.cshtml

    @RenderSection("Foo", required: true)
    

    _SubLayout.cshtml

    @section Foo
    {
        <p>Foo</p>
    }
    
  3. 如果您的 View 需要能够实现一个部分(无论是否必需),子布局必须定义它。例如,在上面的代码中,任何使用 _SubLayout.cshtml 的 View 都无法定义 Foo 部分,因为它不再存在。如果您尝试的话,将会引发异常。为了允许该 View 定义该部分,您必须执行如下操作:

    _SubLayout.cshtml

    @section Foo
    {
        @RenderSection("Foo", required: true)
    }
    

    这定义了用于基本布局的部分,然后允许使用此子布局的任何 View 定义该部分。

如果您需要的话,我的博客上实际上有一篇文章更详细地介绍了这一切:http://cpratt.co/how-to-change-the-default-asp-net-mvc-themet/

关于asp.net-mvc - ASP.NET MVC 中的继承布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39960821/

相关文章:

安卓(测量规范): When Is it possible to get both height and width as "MeasureSpec.UNSPECIFIED"

java - match_parent 布局参数不起作用?

c++ - typedef 一个专门的嵌套模板

asp.net-mvc - 具有键 'MY KEY' 的 ViewData 项的类型为 'System.String',但必须为 'IEnumerable<SelectListItem>' 类型

html - CSS 偶尔不会加载

html - ASP.NET MVC4 - 将包含字符串的 HTML 显示为原始 HTML

android - wrap_content 高度,但限制为父级的一半

javascript - onMouseOver 重复改变图片的背景颜色

python - 嵌套字典 for 循环

Asp.Net MVC 区域,我该如何使用它们?