如何在Razor视图中指定全局MVC布局而不指定布局路径

5

我希望您不必在每个 Razor 视图中手动指定布局路径。

因此,在 Razor 视图中,您通常会指定视图/布局属性,例如:

@{
    ViewBag.Title = "About Us";
    Layout = "~/Views/Shared/_ContentLayout.cshtml";
}

我有一个基础控制器,所有我的控制器都继承自它,在这里我希望能够在这个层次上指定布局,或者在app_start等地方指定。

对于任何异常情况,我只需要在视图本身中覆盖它。

经过广泛搜索,我没有找到任何人能够做到这一点的证据。

目前我的最佳解决方法是将其指定为ViewBag中的内容,以保持其动态性,但我仍然需要在视图中声明:

@{
  Layout = ViewBag.Layout;
}

这可能吗?有解决方案吗?

2个回答

5
自MVC3以来,有一个惯例...参考:http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts

You can add a file called _ViewStart.cshtml (or _ViewStart.vbhtml for VB) underneath the \Views folder of your project:

The _ViewStart file can be used to define common view code that you want to execute at the start of each View’s rendering. For example, we could write code within our _ViewStart.cshtml file to programmatically set the Layout property for each View to be the _ContentLayout.cshtml file by default:

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

Because this code executes at the start of each View, we no longer need to explicitly set the Layout in any of our individual view files (except if we wanted to override the default value above).


相信这回答了我的问题,是的,似乎我已经有那个文件了,谢谢!但是这能够应用于控制器基础上吗?例如,为每个控制器设置一个默认模板? - MikeDub
你也可以在 _ViewStart 中实现这个功能。你可以轻松地使用条件语句来检查控制器,根据控制器设置相应的 Layout - Nkosi

4
如Nkosi所述,如果您想要根据控制器适应布局而不在视图中指定布局路径,则可以在_ViewStart文件中进行条件块。但我发现也有一种方法可行且稍微简单一些...
- 在每个视图文件夹(与控制器相关)中放置一个_ViewStart文件,您希望拥有不同布局的视图文件夹。 - 更具体的View Area文件夹中的_ViewStart覆盖全局_ViewStart文件。

Specifying different layouts in each folder


1
这比我的条件建议容易多了。我完全忽略了嵌套视图的开始。 - Nkosi

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