Новичок в ASP.NET MVC, я не понимаю, как использовать ViewData и / или ViewBag.

Я пытаюсь изучить ASP.NET MVC и наткнулся на код в нашей компании, который использует ViewBag. Я изучил, что это такое, и кажется, что это контейнер для переменных, которые можно объявить в контроллере, а затем получить к ним доступ из представления.

Я использовал другие фреймворки, такие как Ruby on Rails и Struts, которые меня не заставляют делать это. В частности, в Ruby on Rails я могу просто вызвать переменную в представлении, выполнив:

 <%= variable %>

Дальнейшие исследования привели меня к мысли, что использование ViewData и ViewBag не рекомендуется. Может ли кто-нибудь объяснить его использование, а не просто получение переменной непосредственно из контроллера?

Спасибо.


person user1287523    schedule 06.05.2013    source источник
comment
во-первых, вы используете ASP.NET MVC. он отличается от ASP.NET   -  person    schedule 06.05.2013
comment
@ManishMishra Я думал, что есть ASP.NET MVC и ASP.NET Web Forms. Но да, это MVC.   -  person user1287523    schedule 06.05.2013
comment
посмотрите, если это и это поможет вам   -  person    schedule 06.05.2013


Ответы (2)


В ASP.NET MVC вы должны явно передать данные, необходимые представлению, от контроллера к представлению.

Рекомендуемый способ сделать это - использовать строго типизированное представление и передавать данные в форме экземпляра класса:

public ActionResult MyAction() {
    return View(new MyViewModel { Prop1 = "Value1", ... });
}

В вашем представлении вы указываете класс модели, который использует представление:

@model MyViewModel

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

ViewData имеет некоторые другие свойства для доступа к метаданным модели или состоянию модели. См. Например ViewData.ModelMetadata.

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

Да, развязка. В шаблоне MVC указано, что представление не зависит от контроллера. Когда ваше представление может получить доступ к свойствам контроллера, оно будет связано с этим конкретным контроллером, и M в MVC исчезнет.

person Jan    schedule 06.05.2013

И ViewBag, и ViewData предназначены для поддержки развязки представления и контроллера. Данные, которые обычно подходят для ViewModel, могут быть помещены в ViewBag или ViewData для использования в представлении. Такие данные, как данные списка выбора, не обязательно относятся, например, к представлению.

Разница между ViewBag и ViewData заключается в том, что доступ к данным представления осуществляется как к контейнеру ключа / значения (словарю), где к данным в ViewBag осуществляется доступ через свойства (это динамический объект, поэтому присвоение нового значения свойству создает имущество).

Обновлять:

Когда вы используете <%= variable %>, вы получаете доступ к переменной прямо в конкретном представлении. Чтобы контроллер мог установить это значение, он должен быть связан с представлением и назначен напрямую. это, конечно, возможно, но вводит прямое связывание с представлением, которое может вам не понадобиться.

person Peter Ritchie    schedule 06.05.2013
comment
Верно, но почему нет <%= variable %>? - person Henk Holterman; 06.05.2013
comment
Какой стимул помещать его в ViewBag / ViewData вместо ViewModel? - person user1287523; 06.05.2013
comment
@ user1287523 меньше кода, больше динамики, если вы предпочитаете это безопасности типов - person Jan; 06.05.2013
comment
@ user1287523 Я добавил немного подробностей w.r.t <%= variable %> - person Peter Ritchie; 06.05.2013