Должен ли ViewData никогда не использоваться? - PullRequest
3 голосов
/ 15 января 2011

Я пытался проверить лучшие практики использования asp.net mvc, и многие говорят, что мы никогда не должны использовать ViewData. Я прочитал этот пост , и похоже, что из этого.

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

В каких случаях я должен использовать ViewData? Какие рекомендации следует соблюдать при использовании ViewData, чтобы не злоупотреблять им?

Ответы [ 5 ]

3 голосов
/ 15 января 2011

Я предпочитаю использовать строго типизированные модели представления с самого начала. Я очень предпочитаю отсутствие «волшебных струн» при этом.

Никогда не одно правило для всех ситуаций, но обычно это первый подход, который я использую.

0 голосов
/ 15 января 2011

Мне не нравится их использовать, но я нашел их полезными в ситуации, когда я хочу отображать какое-то сообщение пользователю на всех страницах. Например, у меня есть пользовательский элемент управления, который отображает сообщения для пользователя. Это также присутствует на моей главной странице. Он проверяет ViewData["messages"] и TempData["messages"] И если один из них не равен NULL, он отображает присутствующие сообщения. Если они оба нулевые, это не так.

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

0 голосов
/ 15 января 2011

Я часто использую ViewData, когда мне нужно добавить данные в текущий запрос с помощью какого-либо базового контроллера или фильтра. Как правило, главные страницы будут иметь динамическое содержимое, которое должно быть получено с сервера, и вместо того, чтобы изменять модель, возвращаемую представлением, или упаковывать каждую модель, возвращенную в родительскую ViewModel, я могу просто поместить дополнительные данные в ViewData.

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

public abstract partial class BaseController : Controller
{
    public const string MessagesViewDataKey = "Base.Messages";

    protected override void OnActionExecuted(ActionExecutedContext filterContext) {
        if (filterContext != null && filterContext.Controller != null && !filterContext.IsChildAction) {
            filterContext.Controller.ViewData[MessagesViewDataKey] = Messenger.MessageQueues;
        }

        base.OnActionExecuted(filterContext);
    }
}

// site.master
<% if (ViewData[BaseController.MessagesViewDataKey] != null)
           Html.RenderPartial("DisplayTemplates/MessageList", ViewData[BaseController.MessagesViewDataKey]); %>
0 голосов
/ 15 января 2011

Использование строго типизированных ViewPages в паре со строго типизированным Model или ModelView является идеальной практикой ASP.NET MVC.

Вы можете использовать ViewData для передачи дополнительных данных в ViewPage, но я предпочитаю ViewModels, потому что:

  1. Ошибки времени компиляции и ошибки времени выполнения
  2. Поддержка IntellySence
  3. Простой рефакторинг
  4. Нет волшебных строк
  5. Html помощник для создания формы с привязками данных
0 голосов
/ 15 января 2011

Цитата из Scot Gu (ссылка на источник: nerddinnerbook )

Использование строковых словарей, поскольку опечатки могут привести к ошибкам, которые не будут обнаружены при компиляции.время.Нетипизированный словарь ViewData также требует использования оператора «as» или приведения при использовании строго типизированного языка, такого как C #, в шаблоне представления.

...