我有一个组织成多个区域的 ASP.NET MVC 4 站点。每个区域都有一个Views/Shared/_Layout.cshtml
引用公共共享布局的视图。在通用布局中,我有一个包含项目列表的侧边栏。我希望能够拥有所有_Layout.cshtml
视图都可以访问的共享项目列表,以便聚合一组链接。
Area1/Views/Shared/_Layout.cshtml:
@{
SidebarItems.Add("Area1 Item");
Layout = "~/Views/Shared/_Layout.cshtml";
}
视图/共享/_Layout.cshtml:
@{
SidebarItems.Add("Common Item");
}
<ul>
@foreach (var item in SidebarItems)
{
<li>@item</li> @* List should contain two items: "Area1 Item", and "Common Item" *@
}
</ul>
我尝试了两种方法:
WebViewPage<T>
为从公共自定义类继承的每个区域创建一个自定义WebViewPage<T>
类,并使SidebarItems
集合成为公共基类的属性。这不起作用,因为 RazorWebPageView
在布局之间移动时似乎分配了一个新的。创建一个带有静态集合的静态类,每个都
_Layout
调用该静态集合来添加项目。这成功地累积了列表项,但是,由于它是一个静态类,它的生命周期与应用程序域相关联,这意味着侧边栏会累积来自多个请求访问的每个区域的项,而不是每个请求的列表。
我正在考虑使用该HttpRequest.Items
属性,但这似乎太短暂了——项目列表不会因请求而改变,并且完全由显示的区域视图决定。
另一种选择是将列表的呈现推送到section
每个区域中呈现的_Layout
. 这不太理想,因为我希望在呈现列表的代码中有一个点,但这是可行的。
建议?