У меня есть сайт ASP.NET MVC 4, организованный во множество областей. Каждая область имеет вид Views/Shared/_Layout.cshtml
, который ссылается на общий общий макет. В общем макете у меня есть боковая панель, содержащая список элементов. Я хотел бы иметь возможность иметь общий список элементов, доступ к которым можно получить во всех представлениях _Layout.cshtml
, чтобы агрегировать набор ссылок.Добавить данные в общий _Layout.cshtml из области MVC _Layout.cshtml
Area1/Просмотров/Shared/_Layout.cshtml:
@{
SidebarItems.Add("Area1 Item");
Layout = "~/Views/Shared/_Layout.cshtml";
}
Просмотров/Shared/_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
собственности, но, похоже, это было бы слишком недолгим - список элементов не изменяется между запросами и полностью определяется видом района, который отображается.
Другой альтернативой является толкать рендеринг списка в section
, который отображается в каждом поле _Layout
. Это меньше, чем идеально, поскольку я хотел бы иметь одну точку в коде, который отображает список, но выполним.
Предложения?
Кажется хорошо работать. Не могу поверить, что я забыл о «ViewBag». Принять завтра не возникнет никаких других проблем. – Lucas
Отлично! (Не слишком гордясь именами помощников, вы, вероятно, могли бы разработать лучшие, которые имеют смысл для ваших бизнес-требований ...) –