Просмотр моделей (ViewData), UserControls / Partials и глобальные переменные - лучшие практики? - PullRequest
0 голосов
/ 24 июня 2009

Я пытаюсь найти хороший способ иметь «глобальных» членов (таких как CurrentUser, Theme и т. Д.) Во всех моих частях, а также в моих представлениях.

Я не хочу иметь логический класс, который может возвращать эти данные (например, BL.CurrentUser). Я действительно считаю, что это должно быть частью модели в моих представлениях, поэтому я попытался наследовать от BaseViewData с этими членами. В моих контроллерах тем или иным образом (фильтр или базовый метод в моем BaseController) я создаю экземпляр наследующего класса и передаю его как данные представления. До этого момента все было идеально, потому что тогда у меня есть данные моего вида, доступные в основном представлении с базовыми членами. Но как насчет частичных?

Если у меня есть простой фрагмент, который должен отображать сообщение в блоге, он выглядит следующим образом:

<%@ Control Language="C#" AutoEventWireup="true" Inherits="ViewUserControl<Post>" %>

и простой код для визуализации этого частичного на мой взгляд (что его модель. Стоимость 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 }); %>

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

Есть предложения?

Спасибо!

1 Ответ

0 голосов
/ 24 июня 2009

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

...