【问题标题】: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?

【问题讨论】:

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


【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多