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

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

18 ответов

Решение

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

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

ViewData["Foo"]

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

ViewBag.Foo

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

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

Название свойств чувствительно к регистру.

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

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

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

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

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"]

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>

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

как образец 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 Можно проверить на null синтаксический очиститель: ViewBag.Person?.Name
  • ViewData иметь все свойства словаря, как ContainsKey, Addи т.д., так что вы можете использовать ViewData.Add("somekey", "somevalue") имейте в виду, что это может вызвать исключения.
  • С помощью ViewData по просмотрам нужно TypeCasting пока ViewBag нет.

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

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

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

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

Если вы привязываетесь к какому-либо типу "Модель" и имеете случайные элементы "viewbag" или "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, ViewBag, TempData & Session. Credit / coped 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 и выше.
    • Необходимо сделать преобразование типа кода при перечислении.
    • Объект сеанса хранит данные для всех запросов. Действительно для всех запросов, никогда не истекает.

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

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

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

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

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

Здесь и 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 представляет собой пару, такую ​​как ключ и значение, сообщение - ключ, а в кавычках значение - значение.

- Данные просты, поэтому мы не можем использовать здесь приведение типов, если данные сложны, то используем приведение типов.

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 требует приведения типов.

Одно основное отличие, которое я заметил между 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.

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

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

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

In View:

@ViewBag.Name 
@ViewData["Name"] 

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

  1. ViewData используется для передачи данных из контроллера для просмотра
  2. ViewData является производным от класса ViewDataDictionary и в основном представляет собой объект Dictionary, т.е. ключи и значения, где ключи представляют собой строку, а значения - объекты.
  3. Типизация данных требуется при извлечении данных из ViewData из-за его типа данных объекта, а также проверки нулевого значения перед приведением типа, в противном случае это нарушит работу приложения. Если происходит перенаправление, то его значение становится равным нулю. Читать всю разницу между TempData ViewData и View Bag.

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

ViewBag

  1. Он возвращает объект типа.
  2. Это свойство класса.
  3. работает только с .NET Framework 4.0 и выше.
  4. Перед использованием не требуется TypeCasting, так как свойство заложено в природе.
  5. возвращает объект динамического типа, и его свойства также dynamic.
  6. Это немного быстрее, чем.

ViewData

  1. Он возвращает парную коллекцию словаря «ключ-значение».
  2. это объект словаря, и это свойство ControllerBase класс.
  3. быстрее чем ViewBag.
  4. При перечислении требуется код преобразования типа, так как это Коллекции пар словарей.
  5. ViewData возвращает объект (тип пары ключ-значение, а значение - это тип объекта, поэтому вам необходимо выполнить приведение перед использованием)

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

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

Звонок в поле зрения

      @ViewBag.Name    
@ViewData["Name"]

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"] 

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

Другие вопросы по тегам