2010-08-06 5 views
10

Предполагая, что вы хотели разработать свои контроллеры, чтобы использовать ViewModel для хранения данных для отображаемых видов, должно все данные содержатся в ViewModel? Какие условия было бы в порядке обойти ViewModel?Когда можно использовать ViewData вместо ViewModels?

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

ответ

9

Просто для дальнейшего комментария Фабиана; вы можете явно убедиться, что viewdata никогда не используется, следуя шагам, описанным в this article. Там действительно нет оправдания не, чтобы использовать модели для всего.

Если у вас нет другого выбора, кроме как использовать ViewData (скажем, по существующему проекту); по крайней мере, используйте строковые константы для разрешения имен, чтобы избежать использования «магических строк». Что-то вроде строк: ViewData[ViewDataKeys.MyKey] = myvalue; Infact, я использую это для всего, что должно быть «основано на строках» (ключи сеанса, ключи кэш-памяти, ключи кэша вывода VaryByCustom и т. Д.).

+4

+1 - мы всегда используем модели с сильным видом, но используем viewdata для небольших бит дополнительной надстройки. это обычно ТОЛЬКО происходит для нас в частичных представлениях, которые повторно используются в разных местах. –

+1

@jim: Согласен, существуют сценарии (например, общие частичные представления), где это неизбежно; так лучше всего принять меры, чтобы предотвратить стрельбу себе в ногу, когда вам нужно отступить от использования ViewData :) – DanP

+0

Что вы имеете в виду о строковых константах против магических строк и почему использование ViewData в общих частичных представлениях неизбежно? – Howiecamp

2

Я лично никогда не пользуюсь ViewData, все проходит через модель, за исключением случаев, когда я испытываю что-то, и мне быстро нужно видеть значение на экране. Strongtyping!

+0

Я полностью согласен. Волшебные струны в лучшем случае уродливые, и в худшем случае неприятности. Тем не менее, я также использую ViewData для быстрого тестирования материала, но проблема в том, что это заканчивается как постоянное решение! – DaveDev

+0

Yep - 100% согласен. Я бы предпочел, если бы это было даже устаревшим. –

+1

@ Pure.Krome: Вы могли бы, конечно, эмулировать амортизацию, используя метод, описанный в моем сообщении. Переопределение свойства viewdata в базовом контроллере и добавление атрибута [Obsolete()] даст вам тот же результат (по существу). – DanP

1

С точки зрения ASP.NET MVC 2, шаблон ViewModel является предпочтительным. Этот подход в полной мере использует проверку статического типа времени компиляции. Это в сочетании с compiling mvc views сделает ваш рабочий процесс разработки намного быстрее и продуктивнее, поскольку ошибки обнаруживаются во время сборки/компиляции, а не во время выполнения.

3

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

Есть по крайней мере, несколько аргументов в пользу этого:

  1. У вас есть мастер-страница, которая требует некоторых данных могут присутствовать (например, что-то вроде информации о пользователе StackOverflow в заголовке). Применение ActionFilter для всего сайта позволяет легко заполнить эту информацию в ViewData после каждого действия. Чтобы поставить его в модель, потребуется, чтобы каждая другая модель на сайте затем наследовалась от базовой модели (сначала это может показаться неудачным, но может быстро усложниться).

  2. Когда вы проверяете опубликованную форму, если есть ошибки проверки, вероятно, вам захочется повторно привязать модель (с недопустимыми полями) к сообщениям проверки и отображения. Это прекрасно, так как данные в полях ввода отправляются назад и будут привязаны к модели, но как насчет любых других данных, которые ваше мнение требует повторного заполнения? (например, значения выпадающего списка, информационные сообщения и т. д.). Они не будут отправлены назад, и это может стать беспорядочным повторным заполнением их на модели «вокруг» введенных значений ввода. Часто проще иметь метод, который заполняет ViewData данными the..view.

По моему опыту, я нашел, что этот подход работает хорошо.

И, в MVC3, dynamic ViewModels означает, что нет более строкового индексации!

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

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