В чем разница между ViewData и ViewBag?

Я видел ViewBag в MVC 3. Как это отличается от ViewData в MVC 2?

Он использует динамическую функцию C # 4.0. Он достигает той же цели, что и viewdata, и его следует избегать в пользу использования сильно типизированных моделей представлений (так же, как viewdata следует избегать).

Поэтому в основном он заменяет магические строки :

 ViewData["Foo"] 

с магическими свойствами :

 ViewBag.Foo 

для которых у вас нет безопасности во время компиляции.

Я продолжаю обвинять Microsoft в том, что она когда-либо представляла эту концепцию в MVC.

Имя свойств чувствительно к регистру.

Внутренние свойства ViewBag хранятся в виде пар имя / значение в словаре ViewData .

Примечание: в большинстве предварительных версий MVC 3 свойство ViewBag было названо ViewModel, как отмечено в этом fragmentе из примечаний к выпуску MVC 3:

(отредактировано 10-8-12) Было предложено опубликовать источник этой информации, которую я опубликовал, вот источник: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

Контроллеры MVC 2 поддерживают свойство ViewData, которое позволяет передавать данные в шаблон представления с использованием API-интерфейсов с поздними ограничениями. В MVC 3 вы также можете использовать несколько более простой синтаксис с свойством ViewBag для достижения той же цели. Например, вместо записи ViewData [“Message”] = “text” вы можете написать ViewBag.Message = “text”. Вам не нужно определять какие-либо строго типизированные classы для использования свойства ViewBag. Поскольку это динамическое свойство, вы можете просто получить или установить свойства, и он будет динамически их решать во время выполнения. Внутри свойства ViewBag хранятся в виде пар имя / значение в словаре ViewData. (Примечание: в большинстве предварительных версий MVC 3 свойство ViewBag было названо свойством ViewModel.)

ViewBag vs ViewData в MVC

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

Сходства между ViewBag & ViewData:

Помогает поддерживать данные при переходе с controllerа на просмотр. Используется для передачи данных от controllerа к соответствующему виду. Короткое время жизни означает, что значение становится нулевым, когда происходит redirect. Это связано с тем, что их цель – обеспечить способ связи между controllerами и представлениями. Это механизм связи в вызове сервера.

Разница между ViewBag & ViewData:

ViewData – это словарь объектов, который получен из classа ViewDataDictionary и доступен с использованием строк в качестве ключей. ViewBag – это динамическое свойство, которое использует преимущества новых динамических функций в C # 4.0. ViewData требует типизации для сложного типа данных и проверки нулевых значений, чтобы избежать ошибки. ViewBag не требует типизации для сложного типа данных.

Пример ViewBag & ViewData:

 public ActionResult Index() { ViewBag.Name = "Arun Prakash"; return View(); } public ActionResult Index() { ViewData["Name"] = "Arun Prakash"; return View(); } 

Вызов в режиме просмотра

 @ViewBag.Name @ViewData["Name"] 

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

ViewBag : для сложного типа данных не требуется литье типов.

Рассмотрим следующий пример:

 public class HomeController : Controller { public ActionResult Index() { var emp = new Employee { EmpID=101, Name = "Deepak", Salary = 35000, Address = "Delhi" }; ViewData["emp"] = emp; ViewBag.Employee = emp; return View(); } } 

И код для View выглядит следующим образом:

 @model MyProject.Models.EmpModel; @{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "Welcome to Home Page"; var viewDataEmployee = ViewData["emp"] as Employee; //need type casting } 

Welcome to Home Page

This Year Best Employee is!

@ViewBag.Employee.Name

@viewDataEmployee.Name

Все ответы предполагают, что ViewBag и / или ViewData должны передавать данные из Controller в Views что является дезинформацией. оба очень полезны для передачи данных из представлений в макет или частичные в представления (или ViewComponents и т. д.). Это не эксклюзивный controller.

поскольку образец asp.net по умолчанию имеет это на странице макета:

 @ViewData["Title"] - MyApp 

и в любом представлении

 ViewData["Title"] = "Details"; 

Итак, задавая вопрос: «В чем разница между ViewBag и ViewData

Наиболее заметным отличием является ViewData – сильно типизированный словарь, а ViewBag – динамический тип.

Обратите внимание, что данные внутри IS SAME

 ViewData["Title"] = "MyTitle"; ViewBag.Title; // returns "MyTitle"; 

Когда использовать тот или иной?

  • ViewBag не поддерживает недопустимые имена C #. вы не можете получить доступ к ViewData["Key With Space"] с помощью ViewBag
  • ViewBag.Something является динамическим, и у вас могут возникнуть проблемы при вызове методов (например, методов расширения), которые должны знать точный параметр во время компиляции.
  • ViewBag может проверить наличие синтаксического очистителя nulls: ViewBag.Person?.Name
  • ViewData имеет все свойства словаря, такие как ContainsKey , Add и т. Д., Поэтому вы можете использовать ViewData.Add("somekey", "somevalue") помните, что он может генерировать исключения.
  • Использование ViewData в представлениях требует TypeCasting, а ViewBag – нет.

Знание тонких различий, использование того или другого – гораздо более предпочтительный вкус.

Обычно вы можете думать о ViewBag.AnyKey к псевдониму ViewData["AnyKey"]

Могу ли я рекомендовать вам и не использовать?

Если вы хотите «отправить» данные на свой экран, отправьте строго типизированный объект (AKA ViewModel), потому что его легче протестировать.

Если вы привязываетесь к какой-то «Модели» и имеете случайные «очки» или «viewdata», то это затрудняет автоматическое тестирование.

Если вы используете их, подумайте о том, как вы можете реструктурировать и просто использовать ViewModels.

Есть несколько тонких различий, которые означают, что вы можете использовать ViewData и ViewBag несколькими способами из представления. Одно из преимуществ приведено в этом сообщении http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx и показывает, что литье в этом примере можно избежать, используя ViewBag вместо ViewData.

viewdata: это словарь, используемый для хранения данных между View и controllerом, и вам нужно, чтобы объект данных представления был привязан к соответствующей модели в представлении, чтобы иметь возможность извлекать данные из него …

ViewBag: динамическое свойство, похожее на работу с данными просмотра. Однако лучше, потому что его не нужно бросать в свою модель corressponding, прежде чем использовать его в представлении …

 public ActionResult Index() { ViewBag.Name = "Monjurul Habib"; return View(); } public ActionResult Index() { ViewData["Name"] = "Monjurul Habib"; return View(); } In View: @ViewBag.Name @ViewData["Name"] 

Таким образом, мы можем использовать эти значения для передачи информации между controllerом на другую страницу с помощью TEMP DATA

Хотя у вас может не быть технического преимущества для выбора одного формата по сравнению с другим, вы должны знать о некоторых важных различиях между двумя синтаксисами. Одно очевидное различие заключается в том, что ViewBag работает только тогда, когда ключ, к которому вы обращаетесь, является допустимым идентификатором C #. Например, если вы поместите значение в ViewData [“Key With Spaces”], вы не сможете получить доступ к этому значению с помощью ViewBag, потому что код не будет компилироваться. Еще одна ключевая проблема, которую следует учитывать, заключается в том, что вы не можете передавать динамические значения в качестве параметров в методы расширения. Компилятор C # должен знать реальный тип каждого параметра во время компиляции, чтобы выбрать правильный метод расширения. Если какой-либо параметр является динамическим, компиляция завершится неудачей. Например, этот код всегда терпит неудачу: @ Html.TextBox («name», ViewBag.Name). Чтобы обойти это, используйте ViewData [“Name”] или добавьте va

Одно основное отличие, которое я заметил между ViewData и ViewBag:

ViewData: он вернет объект, не имеет значения, что вы назначили ему, и снова нужно возвращать тип к исходному типу.

ViewBag: достаточно умный, чтобы вернуть точный тип, который вы ему назначили, неважно, что вы задали простой тип (т. Е. Int, string и т. Д.) Или сложный тип.

Пример: Код controllerа.

  namespace WebApplication1.Controllers { public class HomeController : Controller { public ActionResult Index() { Products p1 = new Products(); p1.productId = 101; p1.productName = "Phone"; Products p2 = new Products(); p2.productId = 102; p2.productName = "laptop"; List products = new List(); products.Add(p1); products.Add(p2); ViewBag.Countries = products; return View(); } } public class Products { public int productId { get; set; } public string productName { get; set; } } } 

Просмотреть код.

 
    @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries) {
  • @item.productId    @item.productName
  • }

Экран OutPut.

введите описание изображения здесь

Просмотр данных

  1. ViewData используется для передачи данных с controllerа для просмотра
  2. ViewData получен из classа ViewDataDictionary и в основном является объектом Dictionary ieKeys и значениями, где Keys являются String, а значения – объектами.
  3. Представление данных требуется при извлечении данных из ViewData из-за его типа данных объекта, а также проверки нулевого значения valeue перед тем, как отличить тип, иначе он нарушит приложение. Если redirect происходит, то его значение становится равным нулю. Прочитайте полную разницу между TempData ViewData и View Bag

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html

ViewData

  1. ViewData используется для передачи данных с controllerа для просмотра
  2. Он получен из classа ViewDataDictionary
  3. Он доступен только для текущего запроса
  4. Требуется приведение типов для сложного типа данных и проверка нулевых значений во избежание ошибок
  5. Если redirect происходит, то его значение становится нулевым

ViewBag

  1. ViewBag также используется для передачи данных с controllerа в соответствующее представление
  2. ViewBag – это динамическое свойство, которое использует преимущества новых динамических функций в C # 4.0
  3. Он также доступен только для текущего запроса
  4. Если redirect происходит, то его значение становится нулевым
  5. Не требует типизации для сложного типа данных

ViewBag и ViewData – это два средства, которые используются для передачи информации от controllerа для просмотра в ASP.Net MVC. objective использования обоих механизмов – обеспечить связь между controllerом и представлением. Оба имеют короткий срок службы, значение которого становится равным нулю после того, как произошло redirect, то есть, как только страница перенаправила с исходной страницы (где мы установили значение ViewBag или ViewData) на целевую страницу, как ViewBag, так и ViewData становится null.

Несмотря на то, что эти сходства оба (ViewBag и ViewData) – две разные вещи, если мы говорим об их реализации. Различия заключаются в следующем:

1.) Если мы проанализируем оба варианта реализации, то мы увидим, что ViewData – это структура данных словаря – Словарь объектов, полученных из ViewDataDictionary, и ansible с использованием строк как Ключи к этим значениям, в то время как ViewBag использует динамические функции, введенные в C # 4.0 и является динамическим свойством.

2.) При доступе к значениям формы ViewData нам нужно вывести значения (типы данных), поскольку они хранятся как объекты в словаре ViewData, но нет такой необходимости, если мы обращаемся к th-значению в случае ViewBag.

3.) В ViewBag мы можем установить значение следующим образом:

  ViewBag.Name = "Value"; 

и может получить доступ следующим образом:

  @ViewBag.Name 

Хотя в случае ViewData значения могут быть установлены и доступны следующим образом: Установка ViewData следующим образом:

 ViewData["Name"] = "Value"; 

и доступ к такой ценности

  @ViewData["Name"] 

Для получения дополнительной информации нажмите здесь:

Давайте будем гением компьютера.