我有以下项目结构:
/ Views / Shared / _Layout;
/ Areas / Area1 / Views / ControllerName / Index;
...
- / Areas / AreaN / Views / ControllerName / Index。
有什么方法可以强制所有区域使用_Layout作为基本布局?
有什么办法可以做到,而无需添加_ViewStart文件的(例如,通过路由配置)可以吗?
也可以看看:
我有以下项目结构:
/ Views / Shared / _Layout;
/ Areas / Area1 / Views / ControllerName / Index;
...
有什么方法可以强制所有区域使用_Layout作为基本布局?
有什么办法可以做到,而无需添加_ViewStart文件的(例如,通过路由配置)可以吗?
也可以看看:
Answers:
您只需要添加一个名为:
_ViewStart.cshtml
在每个区域视图文件夹下:
/Areas/Area1/Views/_ViewStart.cshtml
并编辑文件以指向根布局,如下所示:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
为了使它起作用,您不必在视图的layout属性中指定值,如果这样做,您将覆盖全局布局
注意:正如Tony所述,您可以编辑每个视图的layout属性以指向根布局,但这不是推荐的方法,因为这将使视图与布局耦合并更改它会很痛苦。
如果您想使用代码来设置默认视图的布局,也许您应该考虑编写一个自定义视图引擎。
尝试在Google上搜索有关自定义RazorViewEngine
和RazorView
本文可能是一个很好的起点
http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx
我还没有做过这样的事情,但我希望能为您指明正确的方向
_ViewStart
直接在Area文件夹中直接添加,以将其应用于所有区域。
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>