Как заполнить строго типизированные viewdata с базового контроллера? - PullRequest
0 голосов
/ 17 декабря 2009

Все мои контроллеры основаны на BaseController, для совместного использования свойств между ними и переопределения OnActionExecuting для установки некоторых значений на основе маршрута.

Я создаю класс BaseViewData, чтобы сделать то же самое для всех моих данных вида.

В данный момент я заполняю данные вида следующим образом (C #):

var viewData = new BaseViewData
{
    Name = "someName",
    Language = "aLanguage",
    Category = "aCategoryName"
};

Я делаю это в каждом действии, которое требует просмотра данных. Некоторые из свойств являются общими, их необходимо устанавливать при каждом действии. Есть ли способ установить некоторые свойства в более глобальном масштабе?

Если я создаю экземпляр класса BaseViewData в методе OnActionExecuting на BaseController, как мне получить доступ к свойствам BaseViewData из действия в обычных контроллерах (производных от BaseController)?

Обновление в ответ на Денниса Палмера:

По сути, я делаю это из-за острой проблемы с ViewData ["lang"], которая не заполняется случайным образом по некоторым запросам ViewData ["lang"] содержит "en", если язык английский, и "ja", если японский (ну, в любом случае, так и должно быть). Я заполняю ViewData ["lang"] внутри OnActionExecuting на BaseController.

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

<% Html.RenderPartial(ViewData["lang"] + "/SiteMenu"); %>

Но я случайно получаю сообщения об ошибках, которые выдают это состояние "Не удается найти / SiteMenu", что указывает на тот факт, что ViewData ["lang"] не имеет значения. Я просто не могу найти причину, по которой ViewData ["lang"] не будет заполнен. Итак, я переписываю сайт, чтобы использовать ТОЛЬКО строго типизированные данные представления (и устанавливаю некоторые жесткие значения по умолчанию). Но если другой метод лучше, я пойду по этому пути.

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 декабря 2009

Я не уверен, что точно следую тому, что вы пытаетесь сделать, но если ваше представление использует значения в маршруте для отображения определенной информации, кажется, что добавление ваших собственных методов расширения для HtmlHelper было бы лучшим способом идти.

Содержатся ли имя, язык и категория в ваших маршрутах? Если это так, то HtmlHelper будет иметь доступ к информации о маршруте и сможет определить, что отображать с помощью методов расширения. Какова взаимосвязь между вашими маршрутами и что ваши взгляды должны знать?

Обновление: Является ли lang частью вашего маршрута? Если это так, то я все равно буду утверждать, что вы могли бы написать метод расширения HtmlHelper, который непосредственно смотрит на данные маршрута и определяет, какое частичное представление следует визуализировать. Таким образом, вашему контроллеру даже не нужно будет беспокоиться об установке ViewData ["lang"]. Представление всегда будет знать, как выполнить рендеринг на основе маршрута.

Обновление 2: Я думаю, что отказ от использования метода расширения HtmlHelper, поскольку он переоценивает данные маршрута, может быть причиной преждевременной оптимизации. Ваша схема наследования контроллера кажется слишком сложной, и вы задали вопрос, потому что способ установки ViewData был ненадежным. Я сомневаюсь, что извлечение значения из данных маршрута было бы намного, если таковые имеются, менее эффективным, чем установка и чтение из ViewData.

Из вашего комментария:

В контроллере я использую значение lang определить, какой вид показывать как хорошо.

Это только заставляет меня думать, что есть больше частей вашей системы, которые мне нужно было бы увидеть, чтобы дать лучший совет. Если у вас есть отдельные представления для каждого языка, тогда почему представлению необходимо указать, какой язык использовать?

Другой альтернативой для рассмотрения было бы использование вложенных главных страниц. У вас может быть одна главная страница для макета сайта, а затем вложенная главная страница для каждого языка, которая содержит только жестко запрограммированное значение языка.

1 голос
/ 17 декабря 2009

Возможно, вместо этой схемы наследования вы можете просто использовать фильтры действий для добавления необходимых данных.

...