92

我有以下项目结构:

  • /视图/共享/_布局;

  • /Areas/Area1/Views/ControllerName/Index;

...

  • /区域/区域/视图/控制器名称/索引。

有没有办法强制所有区域使用_Layout作为基本布局

有没有办法在不添加_ViewStart文件的情况下做到这一点(例如,通过路由配置)?

也可以看看:

如何在 ASP.NET MVC 3 razor ViewStart 文件中指定不同的布局?

4

3 回答 3

161

您只需添加一个名为:

_ViewStart.cshtml

在每个区域视图文件夹下:

/Areas/Area1/Views/_ViewStart.cshtml

并编辑文件以指向根布局,如下所示:

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

为了使其工作,您不必在视图的布局属性中指定值,如果这样做,您将覆盖全局布局

注意:正如 Tony 提到的,您可以编辑每个视图的布局属性以指向根布局,但这不是推荐的方法,因为您会将视图与布局耦合并更改它会很痛苦

编辑 1

如果您想使用代码设置默认视图的布局,也许您应该考虑编写自定义视图引擎。

尝试谷歌关于自定义RazorViewEngineRazorView

这篇文章可能是一个很好的起点

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

我没有做过这样的事情,但我希望我能指出你正确的方向

于 2012-11-07T20:03:07.217 回答
21

扩展 Jupaol 的答案....

至少在VS2013中,_ViewStart.cshtml文件是在创建区域的时候默认添加的,所以它已经存在了,你可以按照他的说明更改内容指向根_Layout.cshtml。然后,您可以删除该区域中的 _Layout.cshtml,因为它不再使用(并且现在是潜在的混淆来源)

但是,通过这样做,在该根 _Layout.cshtml 中执行的任何路由都需要考虑区域。
默认的 _Layout.cshtml 有许多需要稍作修改的 ActionLink 助手:

通过设置 Area="" 将 RouteValueDictionary 参数添加到任何 ActionLink 调用。请注意,空字符串是指根级别。这将允许这些链接在从区域内调用时正常工作,从根调用时仍然有效。

例如:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>
于 2013-12-08T18:12:08.137 回答
3

您可以使用以下方式指定布局:

@{ 布局 = "_Layout"; }

如果你想让这更容易一次改变。也许您可以将其设置为视图包变量并将其传递给控制器​​。为了使它更容易,您可以创建一个其他控制器继承的基本控制器,并将布局分配给那里的视图包。

不知道为什么路由需要改变,或者我不明白。希望这可以帮助 :)

于 2012-11-07T20:00:37.853 回答