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

时间:2012-11-07 19:52:13

标签: asp.net-mvc razor asp.net-mvc-routing asp.net-mvc-areas

我有以下项目结构:

  • /查看/共享/ _layout;

  • /地区/区域1 /查看/ ControllerName /索引;

...

  • /地区/ AreaN /查看/ ControllerName /索引。

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

如果没有添加 _ViewStart 文件(例如,通过路由配置),有没有办法做到这一点?

另见:

How do I specify different Layouts in the ASP.NET MVC 3 razor ViewStart file?

3 个答案:

答案 0 :(得分:142)

您只需要添加名为:

的文件
_ViewStart.cshtml

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

/Areas/Area1/Views/_ViewStart.cshtml

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

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

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

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

编辑1

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

尝试谷歌了解自定义RazorViewEngineRazorView

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

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”; }

如果您想让这一切变得更容易。也许您可以将其设置为视图包变量并将其传递给控制器​​。为了使它更容易,您可以创建一个其他控制器继承的基本控制器,并将布局分配给那里的视图包。

不确定为什么路由需要改变或者我不理解。希望这会有所帮助:)