Asp.net mvc 如何强制在区域之间共享的视图使用区域布局?

Asp.net mvc 如何强制在区域之间共享的视图使用区域布局?,asp.net-mvc,asp.net-mvc-4,razor,Asp.net Mvc,Asp.net Mvc 4,Razor,我有一个ASP.NETMVC4站点,其中包含一些区域,我有一些系统视图,希望在这些区域之间共享。每个区域都有自己的独立布局。当我访问系统视图时(通过显式指定area=”“),它使用主_ViewStart.cshtml文件中的布局页面。问题是,我想用区域的布局来代替 我已经尝试从主_ViewStart.cshtml文件中删除布局声明,甚至完全删除了_ViewStart.cshtml文件,但所做的只是使我的系统视图呈现时完全没有布局 我还遇到了一个解释,说明可以在_ViewStart.cshtml文

我有一个ASP.NETMVC4站点,其中包含一些区域,我有一些系统视图,希望在这些区域之间共享。每个区域都有自己的独立布局。当我访问系统视图时(通过显式指定
area=”“
),它使用主_ViewStart.cshtml文件中的布局页面。问题是,我想用区域的布局来代替

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

我还遇到了一个解释,说明可以在_ViewStart.cshtml文件中放入复杂的逻辑来执行此操作。我尝试过,但在尝试在同一页面上呈现部分视图(特定于区域)时遇到问题。似乎我需要在_ViewStart.cshtml中“重置”area参数,但我还不知道如何做到这一点

如何使主视图(来自
/Views/
文件夹)呈现调用视图的区域的布局?请记住,我不想硬编码到特定区域的布局


显然,要做的事情是在每个区域复制系统视图及其控制器,但我正试图避免重复文件(干式)。

我通过使用自定义的_ViewStart.cshtml将该区域设置为通过ViewContext.RouteData.DataTokens返回的位置,从而实现了这一点。在我的例子中,该区域由ApplicationContext(存储在HttpContext.Current.Items中的一组值)中的TenantType枚举确定,因此获取它并不太困难

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()。这将指示它在common/Views/ControllerName文件夹中查找控制器,我的共享视图位于该文件夹中

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

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