强制所有领域使用相同的布局(Force all Areas to use same Layout)

2019-08-02 10:33发布

我有以下项目结构:

  • /查看/共享/ _layout;

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

...

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

有没有办法强制所有领域使用_layout基地的布局

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

也可以看看:

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

Answer 1:

你只需要添加一个文件名为:

_ViewStart.cshtml

在每个地区查看文件夹:

/Areas/Area1/Views/_ViewStart.cshtml

和编辑文件指向根布局是这样的:

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

为了使这一工作,你不必指定视图的布局属性的值,如果你这样做,你会被重写全球布局

注:由于托尼提到的,您可以编辑每个视图的布局属性指向根布局,然而这并非是推荐的方式做到这一点,因为你将与你的布局来连接你的观点,改变这将是痛苦的

编辑1

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

试着google一下定制RazorViewEngineRazorView

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

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

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



Answer 2:

扩大对Jupaol答案....

至少在VS2013中,_ViewStart.cshtml文件默认情况下,在创建区域时增加,所以它已经存在,并且他指出指向根_Layout.cshtml你可以改变的内容。 然后,您可以删除_Layout.cshtml在该地区,因为它不再使用(现在混乱的潜在来源)

然而,这样做在根_Layout.cshtml进行任何路由需要考虑的地方。
默认_Layout.cshtml有许多需要稍微修改ActionLink的助手:

在RouteValueDictionary PARAM添加到任何ActionLink的设置面积=“”调用。 需要注意的是空字符串指根级别。 这将允许从区域内调用时这些链接才能正常工作,还从根本上调用时工作。

例如:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>


Answer 3:

您可以使用指定的布局:

@ {布局= “_layout”; }

如果你想使这更容易改变的一次。 也许你可以设置它作为视图包变量,并传递它的控制器上。 为了使它更容易,你可以创建一个基控制器,其他控制器继承并将其分配布局视图袋那里。

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



文章来源: Force all Areas to use same Layout