0

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

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

我还看到了这篇文章,它解释了你可以将复杂的逻辑放在你的 _ViewStart.cshtml 文件中来做到这一点。我尝试过,但在尝试在同一页面上呈现部分视图(特定于区域)时遇到问题。看来我需要“重置”_ViewStart.cshtml 中的 area 参数,但我还没有弄清楚如何做到这一点。

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

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

4

1 回答 1

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

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

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

于 2013-11-13T12:22:32.937 回答