我有以下项目结构:
/查看/共享/ _layout;
/地区/区域1 /查看/ ControllerName /索引;
...
有没有办法强制所有区域使用 _Layout 作为基本布局?
如果没有添加 _ViewStart 文件(例如,通过路由配置),有没有办法做到这一点?
另见:
How do I specify different Layouts in the ASP.NET MVC 3 razor ViewStart file?
答案 0 :(得分:142)
您只需要添加名为:
的文件_ViewStart.cshtml
在每个区域视图文件夹下:
/Areas/Area1/Views/_ViewStart.cshtml
编辑文件以指向根布局,如下所示:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
为了使其正常工作,您不必在视图的布局属性中指定值,如果这样做,您将覆盖全局布局
注意:正如Tony所提到的,你可以编辑每个视图的布局属性以指向根布局,但是这不是推荐的方法,因为你将视图与布局耦合改变它会很痛苦
如果您想使用代码设置默认视图的布局,也许您应该考虑编写自定义视图引擎。
尝试谷歌了解自定义RazorViewEngine
和RazorView
这篇文章可能是一个很好的起点
http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx
我没有做过这样的事情,但我希望我能指出你正确的方向
答案 1 :(得分:20)
扩大Jupaol的答案......
至少在VS2013中,默认情况下会在创建区域时添加_ViewStart.cshtml文件,因此它已经存在,您可以在注释时更改内容以指向根_Layout.cshtml。然后,您可以删除该区域中的_Layout.cshtml,因为它已不再使用(现在可能引起混淆)
但是,通过这样做,在根_Layout.cshtml中执行的任何路由都需要考虑区域 默认的_Layout.cshtml有许多需要稍作修改的ActionLink助手:
通过设置Area =“”将RouteValueDictionary参数添加到任何ActionLink调用。请注意,空字符串是指根级别。这将允许这些链接在从区域内调用时正常工作,从根目录调用时仍然有效。
e.g:
<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>
答案 2 :(得分:2)
您可以使用以下方式指定布局:
@ { Layout =“_ Layay”; }
如果您想让这一切变得更容易。也许您可以将其设置为视图包变量并将其传递给控制器。为了使它更容易,您可以创建一个其他控制器继承的基本控制器,并将布局分配给那里的视图包。
不确定为什么路由需要改变或者我不理解。希望这会有所帮助:)