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

Posted

技术标签:

【中文标题】强制所有区域使用相同的布局【英文标题】:Force all Areas to use same Layout 【发布时间】:2012-10-27 22:42:30 【问题描述】:

我的项目结构如下:

/Views/Shared/_Layout;

/Areas/Area1/Views/ControllerName/Index;

...

/Areas/AreaN/Views/ControllerName/Index.

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

有什么方法可以不添加_ViewStart文件(例如通过路由配置)?

另请参阅:

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

【问题讨论】:

这是one good answer 和another 【参考方案1】:

您使用以下方式指定布局:

@ 布局=“_布局”;

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

不确定为什么需要更改路由,或者我不明白。希望这会有所帮助:)

【讨论】:

【参考方案2】:

您只需添加一个名为:

_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

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

【讨论】:

有什么方法可以不添加“_ViewStart”文件(例如通过路由配置)? 在路由内我不这么认为。他们是两个不同的东西。 Routing 负责尝试将当前请求的 URL 与注册在 RoutesTable 中的路由匹配,当找到匹配时,创建一个 IMvcRouteHandler,然后一个 IHttpHandler (MvcHandler) 负责处理控制器的操作。如您所见,这与视图或布局无关。这是因为路由不需要返回视图,它可以返回 json 或 xml。所以路由不是实现这样的事情的正确地方。 也可以直接在Area文件夹中添加_ViewStart,直接应用到所有区域。【参考方案3】:

由 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>

【讨论】:

以上是关于强制所有区域使用相同的布局的主要内容,如果未能解决你的问题,请参考以下文章

强制列中的内容在多个断点上具有相同的高度

所有小提琴的相同区域独立于ggplot2中的方面

Imagemagick 裁剪成瓷砖并强制所有尺寸相同?

使用 d3.js 保存和重新加载强制布局

d3强制定向布局中的神秘力量?

所选 UIButton iOS 的区域