我有一个带有区域的ASP.NET MVC 4站点,我有一些系统视图,我想在这些区域之间共享。每个区域都有自己独立的布局。当我访问系统视图时(通过显式指定area = ""
),它使用主_ViewStart.cshtml文件中的布局页面。问题是,我想改用Area的布局。
我尝试从主_ViewStart.cshtml文件中删除布局声明,甚至完全删除_ViewStart.cshtml文件,但所有这一切都是让我的系统视图渲染时根本没有布局。
我还遇到了this post,它解释了你可以在_ViewStart.cshtml文件中放置复杂的逻辑来执行此操作。我尝试过,但在尝试在同一页面上呈现部分视图时遇到了问题(特定于区域)。我似乎需要在_ViewStart.cshtml中“重置”area参数,但我还没弄清楚如何做到这一点。
如何制作主视图(来自/Views/
文件夹)拍摄调用视图的区域的布局?请记住,我不想将其硬编码到特定区域的布局。
显而易见的事情是在每个区域制作系统视图及其控制器的副本,但我试图避免重复文件(DRY)。
答案 0 :(得分:0)
我设法通过使用自定义的_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()。这指示它在common / Views / ControllerName文件夹中查找控制器,这是我的共享视图所在。
当它调用_ViewStart.cshtml时,它会将Area设置回当前区域(在我的情况下,通过查找数据库中的域名来确定)。这允许Area _Layout.cshtml页面使用存储在Area / Shared文件夹中的部分视图。
最后,我们将布局页面明确设置为当前区域的布局。