Яка різниця між ViewData та ViewBag?


Відповіді:


388

Він використовує динамічну функцію C # 4.0. Він досягає тієї самої мети, що і viewdata, і її слід уникати на користь використання сильно набраних моделей перегляду (так само, як слід уникати viewdata).

Тому в основному він замінює магічні рядки :

ViewData["Foo"]

з магічними властивостями :

ViewBag.Foo

для яких у вас немає безпеки на час компіляції.

Я продовжую звинувачувати Microsoft у тому, що він впроваджував цю концепцію в MVC.

Назва властивостей залежить від регістру.


11
З якою метою ви звинувачуєте Microsoft? Якщо немає даних про те, як ми можемо пов’язати список, що випадає. (Я не думаю, що використання обраного списку всередині моделі було б гарною ідеєю)
Subin Jacob

15
@SubinJacob Ви дійсно повинні поставити нове запитання, якщо хочете відповісти на це. Створення SelectList - це безумовно шлях до створення списку, що випадає.
MiniRagnarok

25
Я думаю, що це трохи суб’єктивно. Сильно набрані моделі є приємними і yada yada, але для тих сценаріїв, коли ви швидко отримуєте огляд і працює, ViewBag і подібні виконують роботу швидше, ніж Controller, View, Model, AutoMapper для ViewModel тощо.
Крейг Бретт,

11
@Darin, чому ти "звинувачуєш" Microsoft у впровадженні цього? Це просто інструмент, наданий розробникам. Якщо ви знаєте, що ви робите, ви можете максимально використати це. Якщо вам це не подобається або ви відчуваєте, що він більш схильний до помилок, просто не використовуйте його. :)
Білал Фазлані

5
Як ви пропонуєте передавати дані між партіями та макетом? Люди звинувачують, коли не бачать повного зображення. Я думаю, що у вас є базові контролери та базові моделі перегляду або статичні / одиночні об'єкти скрізь. Здогадайтесь що, краще навчіться використовувати дані перегляду та звинувачуйте себе у використанні неправильного інструменту для роботи.
Барт Калікто

42

Внутрішні властивості ViewBag зберігаються як пари імен / значень у словнику ViewData .

Примітка: у більшості попередніх версій MVC 3 властивість ViewBag отримало назву ViewModel, як зазначено в цьому фрагменті від приміток до випуску MVC 3:

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

Контролери MVC 2 підтримують властивість ViewData, яка дозволяє передавати дані до шаблону перегляду за допомогою API-інтерфейсу словника пізнього зв’язку. У MVC 3 ви також можете використовувати дещо простіший синтаксис із властивістю ViewBag для досягнення тієї ж мети. Наприклад, замість того, щоб написати ViewData ["Повідомлення"] = "текст", ви можете написати ViewBag.Message = "текст". Вам не потрібно визначати будь-які сильно типізовані класи, щоб використовувати властивість ViewBag. Оскільки це динамічна властивість, ви можете замість цього просто отримати або встановити властивості, і це буде динамічно вирішувати їх під час виконання. Внутрішньо властивості ViewBag зберігаються як пари імен / значень у словнику ViewData. (Примітка: у більшості попередніх версій MVC 3 властивість ViewBag отримало назву властивості ViewModel.)


Питання задає різницю між, ViewDataа ViewBagне про ViewModel.
Меттью Флашен

Дякую за головного керівника Метью Флашену, у мене був помилковий друк у відповіді та виправлено його, тепер читається "ViewData" замість ViewModel, що було помилкою. :)
Rich Bianco

Зараз це неправильно. Ніхто не був перейменований на інший. Вони обидва досі існують. Один є dynamicі підтримує ViewBag.Message. В одному використовується старий ViewData["Message"]синтаксис.
Метью Флашен

1
+1 Але з якого джерела ви цитуєте ...? Справді слід надати посилання.
Сем

1
Дякую Сем за пропозицію. Я додав посилання на першоджерело.
Rich Bianco

34

ViewBag проти ViewData в MVC

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

Подібність між ViewBag та ViewData:

Допомагає зберігати дані при переході від контролера до перегляду. Використовується для передачі даних від контролера до відповідного подання. Короткий термін означає, що значення стає нульовим, коли відбувається перенаправлення. Це тому, що їх мета полягає в тому, щоб забезпечити спосіб спілкування між контролерами та поглядами. Це механізм зв'язку в серверному дзвінку.

Різниця між ViewBag та ViewData:

ViewData - це словник об'єктів, який походить із класу 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"]

7
Ваша відповідь вказує, typecastingале Ви не показували, як виконується
Алекс

31

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
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>

6
допоможіть мені відмовитись, але я думаю, що є помилка. це <h4>@ViewBag.emp.Name</h4> має змінитися на<h4>@ViewBag.Employee.Name</h4>
Бенні Маргаліт

24

Всі відповіді свідчать про те , що ViewBagі / або ViewDataє передача даних Controllerв Viewsякій дезінформація. обидва дуже корисні для передачі даних із "Переглядів" у "Макет" або "Частково" в "Перегляди" (або "Перегляд компонентів" тощо). Це не виключно контролер.

як зразок asp.net за замовчуванням має це на сторінці макета:

<title>@ViewData["Title"] - MyApp</title>

і в будь-якому вигляді

ViewData["Title"] = "Details";

Тож до того, щоб задати питання: "в чому різниця між ViewBagі ViewData?"

Найбільш помітна відмінність - ViewDataце сильно набраний словник, а ViewBagдинамічний.

Зауважте, що дані всередині САМИ

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

Коли користуватися тим чи іншим?

  • ViewBagне підтримує недійсні імена C #. ви не можете отримати доступ ViewData["Key With Space"]зViewBag
  • ViewBag.Something є динамічним, і у вас можуть виникнути проблеми під час виклику методів (наприклад, методів розширення), яким потрібно знати точний параметр під час компіляції.
  • ViewBag може перевірити наявність синтаксичного очищувача нулів: ViewBag.Person?.Name
  • ViewDataмати всі властивості словника, наприклад ContainsKey, Addі т. д., тож ви можете використовувати, ViewData.Add("somekey", "somevalue")майте на увазі, він може кидати винятки.
  • Використання ViewDataдля перегляду потребує TypeCasting, а ViewBagні.

Знання тонких відмінностей, використання тих чи інших - набагато більше смакових переваг.

Зазвичай ви можете придумати ViewBag.AnyKeyсобі псевдонімViewData["AnyKey"]


14

Чи можу я рекомендувати вам не використовувати жодне з них?

Якщо ви хочете "надіслати" дані на екран, надішліть сильно набраний об'єкт (AKA ViewModel), тому що це простіше перевірити.

Якщо ви прив'язуєтесь до якогось типу "Модель" і маєте випадкові елементи "панелі перегляду" або "перегляду даних", то це робить автоматичне тестування дуже важким.

Якщо ви користуєтесь цими, розгляньте, як ви могли б реструктуруватись та просто скористайтеся ViewModels.


4
Ігноруючи принцип "компілятор - це тест першого блоку", як статично набрана модель перегляду робить ваш код більш перевіреним, ніж динамічний тип? Хоча вимога до тестів важливіша в динамічно набраному рішенні, якщо обидва рішення реалізують однакову кількість і тип тестів, ви нічого не втрачаєте.
Даррен Льюїс

Я згоден, це трохи розпливчасто. Можливо, інтелігенція задіяна.
Джошуа Рамірес

1
Одним із прикладів може бути глузування. Якщо ви хочете перевірити дію контролера, простіше створити "макетний" об'єкт, який потрібно обходити і стверджувати, а не намагатися стверджувати, що якийсь рядок був доданий до словника або деяке динамічне поле встановлено на якесь значення - це подібна концепція до договорів на обслуговування, що мають один "Запит" та один "Відповідь", а не приймають кілька параметрів.
полудень

як би ви передавали дані з View у макет, якщо не використовуєте жодне з них? -1
Барт Калікто

Як це відповідь?
JSON

11

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


6

viewdata: це словник, який використовується для зберігання даних між View і контролером, вам потрібно передати об’єкт даних подання у відповідну модель у представленні, щоб мати змогу отримати дані з нього ...

ViewBag: це динамічна властивість, схожа за своєю роботою з даними перегляду, однак краще, тому що її не потрібно відкидати на свою модель корреспонденції, перш ніж використовувати її для перегляду ...


4

Нижче наведено різницю щодо точки зору ViewData, ViewBag, TempData та сесії. Кредит / скопійовано askforprogram.in , перейдіть за посиланням для прикладу коду, який я тут не згадував.

  1. ViewData в MVC

    • ViewData є власністю класу ControllerBase.
    • ViewData - тип об’єкта словника.
    • ViewData - це колекція словників з ключовими значеннями.
    • ViewData була представлена ​​у версії MVC 1.0.
    • ViewData працює з .Net Framework 3.5 і вище.
    • Потрібно зробити перетворення коду під час перерахування.
    • Об'єкт ViewData зберігає дані лише для поточного запиту.
  2. ViewBag в MVC

    • ViewBag є власністю класу ControllerBase.
    • ViewBag - тип динамічного об'єкта.
    • ViewBag - це тип об'єкта.
    • ViewBag був представлений у версії MVC 3.0.
    • ViewBag працює з .Net Framework 4.0 і вище.
    • ViewBag використовує властивість та обробляє його, тому не потрібно робити перетворення типів під час перерахування.
    • Об'єкт ViewBag зберігає дані лише для поточного запиту.
  3. TempData в MVC

    • TempData є власністю класу ControllerBase.
    • TempData - тип об’єкта словника.
    • TempData - це колекція словників з ключовими значеннями.
    • TempData була представлена ​​у версії MVC 1.0.
    • TempData працює з .Net Framework 3.5 і вище.
    • Потрібно зробити перетворення коду під час перерахування.
    • Об'єкт TempData використовується для даних між поточним запитом та наступним запитом.
  4. Сесія в MVC

    • Сесія є власністю контролера (абстрактний клас).
    • Сесія - це тип HttpSessionStateBase.
    • Сесія - це колекція словників ключових значень.
    • Сесія була представлена ​​у версії MVC 1.0.
    • TempData працює з .Net Framework 1.0 і вище.
    • Потрібно зробити перетворення коду під час перерахування.
    • Об'єкт сесії зберігає дані для всіх запитів. Дійсно для всіх запитів, ніколи не закінчується.

1

Хоча у вас не може бути технічної переваги щодо вибору одного формату над іншим, ви повинні знати про деякі важливі відмінності між двома синтаксисами. Одне очевидною відмінністю є те, що ViewBag працює лише тоді, коли ключ, до якого ви звертаєтесь, є дійсним ідентифікатором C #. Наприклад, якщо розмістити значення в ViewData ["Key With Spaces"], ви не можете отримати доступ до цього значення за допомогою ViewBag, оскільки код не буде компілюватися. Ще одна ключова проблема, яку слід врахувати, - це те, що ви не можете передати динамічні значення як параметри методам розширення. Компілятор C # повинен знати реальний тип кожного параметра під час компіляції, щоб вибрати правильний метод розширення. Якщо будь-який параметр динамічний, компіляція не вдасться. Наприклад, цей код завжди вийде з ладу: @ Html.TextBox ("ім'я", ViewBag.Name). Щоб вирішити це, скористайтеся ViewData ["Ім'я"


0
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

In View:

@ViewBag.Name 
@ViewData["Name"] 

0

Таким чином ми можемо використовувати його за допомогою значень для передачі інформації між контролером на іншу сторінку з TEMP DATA


0

Одна з головних відмінностей, яку я помітив між ViewData та ViewBag, це:

ViewData: він поверне об'єкт не має значення, що ви призначили для цього, і вам потрібно знову набрати в початковий тип.

ViewBag: досить розумно повернути точний тип того, що вам призначено, не важливо, погоду вам призначили простий тип (наприклад, int, string тощо) або складний тип.

Наприклад: код контролера.

 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> products = new List<Products>();
            products.Add(p1);
            products.Add(p2);
            ViewBag.Countries = products;
            return View();
        }
    }
    public class Products
    {
        public int productId { get; set; }
        public string productName { get; set; }
    }
}

Переглянути код.

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

Екран OutPut.

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


0

Перегляд даних

  1. ViewData використовується для передачі даних від контролера до перегляду
  2. ViewData походить з класу ViewDataDictionary і в основному є об'єктом словника, тобто ключів і значень, де ключі є рядковими, тоді як значення будуть об'єктами.
  3. Під час отримання даних з ViewData потрібні введення даних для передачі даних через його тип даних, а також перевірка нульового значення для кастингу типу, інакше це порушить додаток. Якщо відбудеться перенаправлення, то його значення стає нульовим. Прочитайте повну різницю між TempData ViewData та View Bag

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


0
ViewData
  1. ViewData використовується для передачі даних від контролера до перегляду
  2. Він походить від класу ViewDataDictionary
  3. Він доступний лише для поточного запиту
  4. Потрібна введення тексту для складного типу даних і перевірка нульових значень, щоб уникнути помилок
  5. Якщо відбудеться перенаправлення, то його значення стає нульовим
ViewBag
  1. ViewBag також використовується для передачі даних від контролера до відповідного представлення
  2. ViewBag - це динамічна властивість, яка використовує нові динамічні функції в C # 4.0
  3. Він також доступний лише для поточного запиту
  4. Якщо відбудеться перенаправлення, то його значення стає нульовим
  5. Не вимагає набору типів для складного типу даних

0

Тут ViewData і ViewBag використовуються для передачі даних від Controller до View .

1. ViewData

- ViewData - це об'єкт словника, який походить від класу ViewDataDictonary .

- Дані допускають лише один запит, значення ViewData очищаються, коли відбувається перенаправлення сторінки.

- Перед використанням значення ViewData має бути набрано cate.

Приклад: У контролері

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

У перегляді

@ViewData["Message"];

- З ViewData є така пара, як Ключ і Значення , Повідомлення є Ключовим, а перевернута кома - Значення.

- Дані прості, тому ми не можемо використовувати тут typecasting, якщо дані складні, тоді використовуємо кастинг типів.

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

- Дані View можуть бути вилучені як

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. ViewBag

--ViewBag використовує динамічну функцію.ViewBag обгортку навколо ViewData.

- Для перегляду типу ViewBag потрібне кастинг.

- Те саме, що ViewData, якщо перенаправлення відбувається, значення стає нульовим.

Приклад:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

У перегляді

@ViewBag.vbMessage

- Для складного типу використовуйте ViewBag

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

- Дані View можуть бути вилучені як

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

- головна відмінність полягає в тому, що ViewBag не вимагає набору клавіш, але для ViewData потрібна введення тексту .


-1

ViewBag і ViewData - це два засоби, які використовуються для передачі інформації від контролера для перегляду в ASP.Net MVC. Мета використання обох механізмів - забезпечити комунікацію між контролером та View. У обох є короткий термін служби, що значення обох стає нульовим після того, як перенаправлення відбулося, тобто, як тільки сторінку перенаправлено зі сторінки-джерела (де ми встановили значення ViewBag або ViewData) на цільову сторінку, як ViewBag, так і ViewData стає недійсним.

Незважаючи на те, що вони мають подібність (ViewBag і ViewData), це дві різні речі, якщо говорити про реалізацію обох. Відмінності полягають у наступному:

1.) Якщо проаналізувати обидву реалізацію розумно, то виявимо, що ViewData є структурою даних словника - Словник об'єктів, отриманий з ViewDataDictionary і доступний за допомогою рядків у вигляді ключів до цих значень, тоді як ViewBag використовує динамічні функції, введені в C # 4.0 та є динамічною властивістю.

2.) Під час доступу до значень форми ViewData нам потрібно ввести значення (типи даних), оскільки вони зберігаються як Об'єкти в словнику ViewData, але такої потреби немає, якщо ми звертаємось до цього значення у випадку ViewBag.

3.) У ViewBag ми можемо встановити таке значення:

      ViewBag.Name = "Value"; 

і отримати доступ до нього можна наступним чином:

          @ViewBag.Name

Тоді як у випадку ViewData значення можна встановити та отримати доступ до них: Установка ViewData наступним чином:

ViewData["Name"] = "Value";

і отримати доступ до такої цінності

 @ViewData["Name"] 

Детальніше натисніть тут:


2
вибачте, що я заперечив, але ця відповідь вимагає декількох абзаців, щоб сказати нічого корисного. Корисним, що бракує у прийнятій відповіді, було б речення "viewbag - це динамічна обгортка навколо viewdata", про яку я дізнався з rachelappel.com/…
Кріс Ф Керролл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.