ASP.NET MVC中的继承布局

托马斯·库贝斯(Tomas Kubes)

大多数页面都有默认布局_Layout.cshtml。但是,对于某些页面组,我希望略微修改默认布局。我知道我可以复制该文件并对其进行一些修改,但这将意味着复制代码并使用99%的相同代码维护两个布局。

我想继承默认的布局,如下所示:

LayoutInherited.cshtml:

Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.BodyContentClassSpecial = "";

@section header{
<style>
    #body-content {
        width: 90%;
        margin: 0 auto;
    }
</style>

}

可以做这样的事情吗?

克里斯·普拉特

是的,可以继承布局。本质上,您只是在创建一个本身利用布局的布局,因为布局只是视图,所以这没有问题。

您几乎完全按照您的描述来做:

_SubLayout.cshtml

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

@RenderBody()

请记住以下几点:

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

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

    _Layout.cshtml

    @RenderSection("Foo", required: true)
    

    _SubLayout.cshtml

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

    _SubLayout.cshtml

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

    这定义了用于基础布局的部分,然后允许使用该子布局的任何视图定义该部分。

如果您需要,我的博客上实际上有一篇帖子对此进行了更详细的介绍:http : //cpratt.co/how-to-change-the-default-asp-net-mvc-themet/

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章