我将ASP.NET MVC 4站点组织成多个区域。每个区域都有一个Views/Shared/_Layout.cshtml
视图,该视图引用了一个共同的共享布局。在公共布局中,我有一个侧边栏,其中包含一个项目列表。我希望能够拥有所有_Layout.cshtml
个视图都可以访问的项目的共享列表,以便聚合一组链接。
区域1 /查看/共享/ _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
集合成为公共基类的属性。这不起作用,因为Razor在布局之间移动时会分配新的WebPageView
。
使用静态集合创建一个静态类,每个_Layout
调用以添加项目。这成功地累积了列表项,但是,由于它是静态类,因此它的生命周期与应用程序域相关联,这意味着侧栏会累积来自多个请求中访问的每个区域的项目,而不是每个请求列表。
我正在考虑使用HttpRequest.Items
属性,但这似乎太短暂了 - 项目列表不会在请求之间发生变化,完全取决于显示的区域视图。 / p>
另一种方法是将列表的呈现推送到每个区域section
中呈现的_Layout
。这不太理想,因为我希望在代码中有一个点来呈现列表,但是可行。
建议?
答案 0 :(得分:3)
您可以尝试使用ViewBag。
我通过向ViewBag添加名为Items
的属性进行了快速测试。这将通过添加公共项目从每个区域(通过添加其自己的项目)和主要布局填充。然后它将用于渲染主布局中的项目列表。
<强>区域1 \视图\ Shared_Layout.cshtml 强>
@{
ViewBag.Title = "_Layout";
Layout = "~/Views/Shared/_Layout.cshtml";
if (ViewBag.Items == null){ViewBag.Items = new List<String>();}
ViewBag.Items.Add("Area1 item");
}
<h2>Area1 Layout</h2>
@RenderBody()
Views \ Shared_Layout.cshtml(部分内容)
@{
if (ViewBag.Items == null){ViewBag.Items = new List<String>();}
ViewBag.Items.Add("Common Item");
}
<ul>
@foreach (var item in ViewBag.Items)
{
<li>@item</li> @* List should contain two items: "Area1 Item", and "Common Item" *@
}
</ul>
我不太喜欢该代码看起来如何,因为它重复了很多并且传播了ViewBag.Items的用法。通过使用Html帮助程序将项添加到列表并呈现列表,可以更清晰。例如,您可以创建以下2个Html帮助程序:
public static class HtmlHelpers
{
public static void AddCommonListItems(this HtmlHelper helper, params string[] values)
{
if(helper.ViewContext.ViewBag.Items == null) helper.ViewContext.ViewBag.Items=new List<String>();
helper.ViewContext.ViewBag.Items.AddRange(values);
}
public static MvcHtmlString CommonList(this HtmlHelper helper)
{
if (helper.ViewContext.ViewBag.Items == null)
return new MvcHtmlString(new TagBuilder("ul").ToString());
var itemsList = new TagBuilder("ul");
foreach (var item in helper.ViewContext.ViewBag.Items)
{
var listItem = new TagBuilder("li");
listItem.SetInnerText(item);
itemsList.InnerHtml += listItem.ToString();
}
return new MvcHtmlString(itemsList.ToString());
}
}
然后你的观点看起来会更清晰,因为他们只会使用这些助手并避免重复代码:
Area1 \ Views \ Shared_Layout.cshtml(使用新的Html帮助程序)
@{
ViewBag.Title = "_Layout";
Layout = "~/Views/Shared/_Layout.cshtml";
Html.AddCommonListItems("Area1 item", "Area1 item 2");
}
<h2>Area1 Layout</h2>
@RenderBody()
Views \ Shared_Layout.cshtml(部分内容,使用新的Html帮助程序)
@{Html.AddCommonListItems("Common Item");}
@Html.CommonList()