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

Mik*_*ail 79 asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas razor

我有以下项目结构:

  • /查看/共享/ _layout;

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

...

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

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

有没有办法在不添加_ViewStart文件的情况下执行操作(例如,通过路由配置)?

也可以看看:

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

Jup*_*aol 144

您只需添加一个名为的文件:

_ViewStart.cshtml
Run Code Online (Sandbox Code Playgroud)

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

/Areas/Area1/Views/_ViewStart.cshtml
Run Code Online (Sandbox Code Playgroud)

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

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑1

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

试着谷歌关于自定义RazorViewEngineRazorView

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

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

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

  • 在路由中我不这么认为.他们是两个不同的东西.路由负责尝试将当前请求URL与在RoutesTable中注册的路由匹配,当找到匹配时,创建IMvcRouteHandler,然后IHttpHandler(MvcHandler)负责处理控制器的操作.如您所见,这与视图和布局无关.这是因为路由不需要返回视图,它可以返回json或xml.因此,路由不是实现这样的东西的正确位置. (2认同)

小智 20

扩大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>
Run Code Online (Sandbox Code Playgroud)