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


87

我有以下项目结构:

  • / Views / Shared / _Layout;

  • / Areas / Area1 / Views / ControllerName / Index;

...

  • / Areas / AreaN / Views / ControllerName / Index。

有什么方法可以强制所有区域使用_Layout作为基本布局

有什么办法可以做到,而无需添加_ViewStart文件的(例如,通过路由配置)可以吗?

也可以看看:

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


Answers:


154

您只需要添加一个名为:

_ViewStart.cshtml

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

/Areas/Area1/Views/_ViewStart.cshtml

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

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

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

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

编辑1

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

尝试在Google上搜索有关自定义RazorViewEngineRazorView

本文可能是一个很好的起点

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

我还没有做过这样的事情,但我希望能为您指明正确的方向


1
有什么方法可以执行而无需添加“ _ViewStart”文件(例如,通过路由配置)?
米哈伊尔(Mikhail)2012年

2
在路由中,我不这么认为。他们是两个不同的东西。路由负责尝试将当前请求URL与在RoutesTable中注册的路由进行匹配,找到匹配项后,将创建IMvcRouteHandler,然后由IHttpHandler(MvcHandler)负责处理控制器的操作。如您所见,这与视图或布局无关。这是因为路由没有必要返回一个视图,它可以返回json或xml。因此,路由并不是实现此类内容的正确位置。
Jupaol 2012年

您也可以_ViewStart直接在Area文件夹中直接添加,以将其应用于所有区域。
阿图尔

21

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>

2

您可以使用以下命令指定布局:

@ {Layout =“ _Layout”; }

如果您想使其更容易一次更改所有内容。也许您可以将其设置为view bag变量,然后将其传递给控制器​​。为了使它变得更加容易,您可以创建一个其他控制器继承的基本控制器,并将其分配给那里的视图包。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.