2009-06-24 5 views
0

Я пытаюсь найти хороший способ иметь «глобальных» участников (таких как 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 }); %> 

Мне просто интересно, есть ли другой способ реализовать это, прежде чем двигаться дальше.

Любые предложения?

Спасибо!

ответ

0

Вы считали, что нужно хранить эти вещи в сеансе и писать строго типизированную оболочку вокруг сеанса, которая даст вам доступ к этой информации? Затем в любом представлении вы можете просто создать новый класс-оболочку с помощью свойства SessionPage (или ViewUserControl) Session и использовать его.

+0

Я не думаю, что сеанс является решением, поскольку он хранится на сервере в течение длительного времени, но вы дали мне новое направление: использовать HttpContext.Current.Items и позволить BaseViewData извлекать данные оттуда , Когда действие сначала подготавливает ViewData, BaseViewData будет хранить данные в HttpContext.Current.Items (используя средства настройки BaseViewData), и когда другие частичные файлы будут получать доступ к этим свойствам, они будут считаны из HttpContext.Current.Items (с использованием getProxy BaseViewData) , Все еще ищет более элегантное решение, хотя это звучит лучше. Спасибо! – elado

+1

Ваши примеры: текущий пользователь, тема - кажется, что они были бы хорошими кандидатами для проведения всей сессии. У вас есть другие «глобальные» свойства, которые не подходят для этой формы? – tvanfosson

 Смежные вопросы

  • Нет связанных вопросов^_^