强制所有区域使用相同的布局
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
如果您想使用代码设置默认视图的布局,或许您应该考虑编写自定义视图引擎。
尝试谷歌自定义RazorViewEngine
和RazorView
这篇文章可能是一个很好的起点
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>
【讨论】:
以上是关于强制所有区域使用相同的布局的主要内容,如果未能解决你的问题,请参考以下文章