Я пытаюсь найти хороший способ иметь «глобальных» участников (таких как CurrentUser, Theme и т. Д.) Во всех моих частях, а также в моих представлениях.Просмотр моделей (ViewData), UserControls/Partials и глобальных переменных - лучшая практика?
Я не хочу иметь логический класс, который может вернуть эти данные (например, BL.CurrentUser). Я считаю, что он должен быть частью модели в моих представлениях. Поэтому я попытался наследовать из BaseViewData этими членами. В моих контроллерах, так или иначе (фильтр или базовый метод в моем BaseController), я создаю экземпляр класса наследования и передаю его как данные представления. Все до совершенства до этого момента, поэтому у меня есть данные моего представления на основном представлении с базовыми членами. Но как насчет частичных?
Если у меня есть наипростейшая, что нужно, чтобы отобразить сообщение в блоге, то это выглядит следующим образом:
<%@ Control Language="C#" AutoEventWireup="true" Inherits="ViewUserControl<Post>" %>
и простой код, чтобы сделать это частичное, на мой взгляд (что его model.Posts является IEnumerable<Post>
):
<%foreach (Post p in this.Model.Posts) {%>
<%Html.RenderPartial("Post",p); %>
<%}%>
Поскольку частичная модель не является BaseViewData, у меня нет доступа к этим свойствам. Таким образом, я попытался сделать класс с именем PostViewData, который наследует от BaseViewData, но тогда мои содержащие мнения будут иметь код на самом деле создать PostViewData в них для того, чтобы передать его парциальное:
<%Html.RenderPartial("Post",new PostViewData { Post=p,CurrentUser=Model.CurrentUser,... }); %>
Или я мог бы используйте конструктор копирования
<%Html.RenderPartial("Post",new PostViewData(Model) { Post=p }); %>
Мне просто интересно, есть ли другой способ реализовать это, прежде чем двигаться дальше.
Любые предложения?
Спасибо!
Я не думаю, что сеанс является решением, поскольку он хранится на сервере в течение длительного времени, но вы дали мне новое направление: использовать HttpContext.Current.Items и позволить BaseViewData извлекать данные оттуда , Когда действие сначала подготавливает ViewData, BaseViewData будет хранить данные в HttpContext.Current.Items (используя средства настройки BaseViewData), и когда другие частичные файлы будут получать доступ к этим свойствам, они будут считаны из HttpContext.Current.Items (с использованием getProxy BaseViewData) , Все еще ищет более элегантное решение, хотя это звучит лучше. Спасибо! – elado
Ваши примеры: текущий пользователь, тема - кажется, что они были бы хорошими кандидатами для проведения всей сессии. У вас есть другие «глобальные» свойства, которые не подходят для этой формы? – tvanfosson