【问题标题】:MVC Layout VS MVC Master PageMVC 布局 VS MVC 母版页
【发布时间】:2012-11-10 12:35:22
【问题描述】:

我开始学习 MVC4。我遇到了基于 Razor 模板或母版页创建视图的两种可能性。

我想了解两者的实际区别

现在,我可以看到,如果我使用母版页创建视图,我可以覆盖多个部分。例如,如果我的 Master 定义了一个“左列”占位符和一个“正文”占位符,我不仅可以为特定视图定义正文,而且还可以在“左列”部分中呈现内容,例如显示控件绑定到页面所在的上下文(从搜索框到股票报价查看器)。 此外,不能通过使用 Razor 模板来定义母版页,这些模板比其他语法简洁得多(部分错误:someone 设法破解了这方面)。

使用 Razor 布局,我只能定义页面的 一个 可以被特定视图覆盖的连续块,并且我应该使用多个布局(打破 DRY)对页。 我之前的陈述是否正确还是我遗漏了什么?

显然我可以通过善用jQuery在页面的任何部分呈现内容,但那是另一回事

【问题讨论】:

  • 在 Razor 布局中,您可以定义多个 sections。您应该阅读这篇关于 layouts and sections 如何在 Razor 中工作的文章。

标签: razor asp.net-mvc-4 master-pages


【解决方案1】:

您可以将部分与 Razor 一起使用。 Scott Gu 在这里写了关于他们的博客:http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

在您的布局中,您可以定义任意数量的部分:

<div id="leftMenu">
    @RenderSection("LeftMenu", required: false)
</div>

您可以在视图中覆盖它:

@section LeftMenu {
    <div>... here comes the left menu for this view ...</div>
}

您还可以测试是否在视图中定义了一个部分,如果没有提供一些默认内容:

@if (IsSectionDefined("LeftMenu")) { 
    @RenderSection("LeftMenu")
}
else { 
    <div>Some default left menu</div>
}

【讨论】:

    【解决方案2】:

    从 MVC3 开始,引入了剃刀视图引擎。在高层次上,视图引擎基本上就是获取视图并呈现必要的 HTML。 Razor 使用 _layout.cshtml 文件和它自己的模板系统,类似于母版页。但是,MVC3 和 4 有另一个称为 WebForms View Engine 的视图引擎,它确实使用母版页。如果您分别查看 MVC1 和 MVC2 教程,您将看到母版页。在 MVC3 之前,只有 WebForms 视图引擎。

    现在就功能而言,两者是相似的。母版页允许您定义内容占位符,而 Razor 允许您定义部分。两者之间的一个主要区别在于页面的呈现方式。母版页在外部呈现页面,这意味着首先是母版页,然后是内容占位符。我相信 Razor 是递归的,从最里面的部分开始,然后往回走。

    查看此博客文章以了解有关剃刀布局的更多信息: http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

    就首选哪一个而言,两种视图引擎都存在;但是如果你想使用剃刀语法——我强烈推荐——那么你必须使用布局系统。 Razor 不允许您使用母版页。

    【讨论】:

    • 感谢您的详细解答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多