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

我有以下项目结构:

  • /查看/共享/ _layout;

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

  • ...

  • /地区/ AreaN /浏览/ ControllerName /索引。
  • 有什么办法可以强制所有区域使用_Layout作为基础布局吗?

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

    也可以看看:

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


    你只需要添加一个名为:

    _ViewStart.cshtml
    

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

    /Areas/Area1/Views/_ViewStart.cshtml
    

    并编辑文件以指向这样的根布局:

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

    为了达到这个目的,你不必在视图的布局属性中指定一个值,如果你这样做,你会覆盖全局布局

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

    编辑1

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

    尝试谷歌有关自定义RazorViewEngineRazorView

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

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

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


    扩大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>
    

    您可以使用

    @ {Layout =“_Layout”; }

    如果你想让这更容易一次全部改变。 也许你可以将它设置为一个视图包变量并将其传递到控制器上。 为了使它更容易,您可以创建一个基础控制器,其他控制器继承自基础控制器,并让它将布局分配给视图包。

    不知道为什么布线需要改变,或者我不了解。 希望这可以帮助 :)

    链接地址: http://www.djcxy.com/p/80089.html

    上一篇: Force all Areas to use same Layout

    下一篇: How do you define a layout for specific areas in ASP.Net MVC 4?