强制所有区域使用相同的布局
我有以下项目结构:
-
/查看/共享/ _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
如果你想使用代码来设置默认视图的布局,也许你应该考虑编写一个自定义视图引擎。
尝试谷歌有关自定义RazorViewEngine
和RazorView
这篇文章可能是一个很好的起点
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的基础控制器,并将其布局分配给视图包。
不知道为什么路由需要改变,或者我不了解。 希望这可以帮助 :)