如何在ASP.NET MVC 3 Preview 1中指定默认的Razor布局页?

25

我想在Razor中指定(一个地方)默认的布局页面,以便我可以删除这个:

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

我希望能从每个 .cshtml 文件中获取内容,但我不知道该如何实现...有什么想法吗?我正在使用来自 ASP.NET MVC 3 Preview 1 的 Razor 引擎。


这里的第二个答案应该被标记为被接受的答案,以造福于社区的其他成员。 - Brondahl
3个回答

68
创建一个"~/Views/_ViewStart.cshtml"页面,并在其中添加以下内容:
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

请注意,您可以在此处编写代码,因此可以根据目标设备的类型更改布局等。
这现在在空的MVC3项目中默认创建。 来源

还发现了这篇有用的文章,它说明了使用这种方法针对不同设备进行定位的方式:http://www.michaelfcollins3.me/2011/01/changing-your-razor-view-layout-for-themes-and-devices/ - miguelv
1
不确定发生了什么事,但出于某种原因,我的浏览器决定对这个答案进行了负评。而它并没有任何问题。我直到现在才注意到这一点,所以我无法再更改它,对此我深表歉意! - Lennard Fonteijn

2
看起来实现这个的方法是使用位于视图目录根目录中的_init.cshtml文件,其中包含公共页面元素(头部)。当Razor视图引擎构建您的页面时,它会自动查找几个特定的文件,分别称为_start.cshtml、_init.cshtml和_end.cshtml;这些文件将按照顺序由视图引擎加载每个请求。在这些文件中放置LayoutPage定义和/或其他常见的初始化操作将确保它们在所有页面上运行。
注意:我不确定效果是否传递到子目录中,因为文档中并不清楚;您需要尝试并找出结果。
有关如何执行此操作的更详细信息可在Microsoft的Razor生成网页的操作指南书籍中找到。我在第169页发现了名为“在文件夹中运行文件之前和之后的代码”的部分。请检查 Microsoft下载页面获取完整的书籍以及其他Razor示例。

是的,我听说过它。但无论我把_init.cshtml放在哪里都不起作用...为什么呢?顺便说一下,非常感谢您提供的链接,它将在未来对我很有帮助! - Darmak
再看一遍书,我发现上面写着将_init.cshtml、_start.cshtml和_end.cshtml放在你的网站根目录下,就像Global.asax一样。 - Nathan Taylor
1
“_init.cshtml”在MVC 3 Preview 1中无法工作,因此您不能遵循该模式。但是,这将在未来的版本中得到支持。 - marcind
@marcind,不知道你是从哪里得到这个信息的,可以问一下吗? - Nathan Taylor
那对我来说似乎是一个可靠的信息来源 =D - Nathan Taylor
此外,不存在所谓的_end.cshtml文件。 - Eilon

0

在MVC 3 Preview 1中没有简单的方法来实现这一点。这是预览版本的限制,将在即将发布的版本中得到解决。不幸的是,在此MVC3预览版中,_init.cshtml文件无法工作,因此您无法遵循Web页面模式。

我可以想到两种方法使其工作(虽然都不是最佳选择)

  1. 编写自己的页面基类,该基类派生自WebViewPage并在构造函数中设置正确的布局...但在这种情况下,您必须在每个视图中指定一个@inherits指令。
  2. 在操作方法中设置布局覆盖(使用View(string viewName, string masterName)覆盖)。您可以编写一个中间控制器基类,该基类将具有帮助程序方法,以免重复布局。

3
为了造福社区的其他人:请注意第二个答案被广泛认为更好。 - Brondahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接