强制所有区域使用相同的布局

我有以下项目结构:

  • /查看/共享/ _layout;

  • /地区/区域1 /浏览/ ControllerName /指数;

  • /地区/ AreaN /浏览/ ControllerName /索引。

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

有没有办法做到这一点,而不需要添加_ViewStart文件(例如,通过路由configuration)?

也可以看看:

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

你只需要添加一个名为:

_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

我没有做过这样的事情,但我希望我能指引你朝着正确的方向前进

扩大Jupaol的答案….

至less在VS2013中,_ViewStart.cshtml文件是在创build区域时默认添加的,所以它已经在那里了,你可以改变它的内容来指向根_Layout.cshtml。 然后,您可以删除该区域的_Layout.cshtml,因为它不再被使用(现在可能是混淆的原因)

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

通过设置Area =“”将RouteValueDictionary参数添加到任何ActionLink调用中。 请注意,空string是指根级别。 这将允许这些链接在从一个区域内被调用时正确地工作,当从根被调用时仍然工作。

例如:

 <li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li> 

您可以使用

@ {Layout =“_Layout”; }

如果你想让这个更容易一次改变。 也许你可以将它设置为一个视图包variables,并将其传递到控制器上。 为了使它更容易,你可以创build一个其他控制器inheritance的基础控制器,并将其布局分配给视图包。

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