【问题标题】:How do I force a view that is shared between areas to use the area layout?如何强制区域之间共享的视图使用区域布局?
【发布时间】:2013-11-13 11:26:51
【问题描述】:

我有一个带有区域的 ASP.NET MVC 4 站点,并且我有一些想要在这些区域之间共享的系统视图。每个区域都有自己独立的布局。当我访问系统视图(通过明确指定area = "")时,它使用主 _ViewStart.cshtml 文件中的布局页面。问题是,我想改用区域的布局。

我尝试从主 _ViewStart.cshtml 文件中删除 Layout 声明,甚至完全删除 _ViewStart.cshtml 文件,但所做的只是让我的系统视图呈现完全没有布局。

我还遇到了this post,它解释了您可以将复杂的逻辑放入您的 _ViewStart.cshtml 文件中来执行此操作。我尝试过,但在尝试在同一页面上呈现部分视图(特定于区域)时遇到问题。看来我需要“重置”_ViewStart.cshtml 中的 area 参数,但我还没有弄清楚该怎么做。

如何使主视图(来自/Views/ 文件夹)采用称为视图的区域的布局?请记住,我不想将其硬编码到特定区域的布局中。

显而易见的做法是在每个区域复制系统视图及其控制器,但我试图避免重复文件 (DRY)。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 razor


    【解决方案1】:

    我设法通过使用自定义的 _ViewStart.cshtml 来实现这项工作,该 _ViewStart.cshtml 通过 ViewContext.RouteData.DataTokens 将该区域设置回原来的位置。在我的例子中,该区域由 ApplicationContext 中的 TenantType 枚举(一组存储在 HttpContext.Current.Items 中的值)确定,因此并不难。

    var appContext = new ApplicationContext();
    var area = appContext.CurrentTenant.TenantType.ToString();
    this.ViewContext.RouteData.DataTokens["area"] = area;
    Layout = "~/Areas/" + area + "/Views/Shared/_Layout.cshtml";
    

    所以基本上,我们调用了一个名为 SystemController 的共享控制器,它只返回 View()。这指示它在公共 /Views/ControllerName 文件夹中查找控制器,这是我的共享视图所在的位置。

    当它调用 _ViewStart.cshtml 时,它会将 Area 设置回当前区域(在我的例子中,它是通过在数据库中查找域名来确定的)。这允许 Area _Layout.cshtml 页面使用存储在 Area/Shared 文件夹中的局部视图。

    最后,我们将布局页面显式设置为当前区域的布局。

    【讨论】:

      猜你喜欢
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      相关资源
      最近更新 更多