Какая разница между ViewData и ViewBag?

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

Ответ 1

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

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

ViewData["Foo"]

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

ViewBag.Foo

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

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

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

Ответ 2

Внутренне Свойства ViewBag сохраняются как пары имя/значение в словаре ViewData​​strong > .

Примечание. В большинстве предварительных версий 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 = "text". Вам не нужно определять какие-либо строго типизированные классы для использования Свойство ViewBag. Потому что это динамическое свойство, вы можете вместо этого просто получить или установить свойства, и это будет разрешать их динамически во время выполнения. Внутренне свойства ViewBag хранится как пары имя/значение в Словарь ViewData. (Примечание: в большинстве предварительные версии MVC 3, Свойство ViewBag было названо Свойство ViewModel.)

Ответ 3

ViewBag против ViewData в MVC

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

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

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

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

ViewData - это словарь объектов, производный от класса ViewDataDictionary и доступный с использованием строк в качестве ключей. ViewBag - это динамическое свойство, использующее преимущества новых динамических функций в С# 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"]

Ответ 4

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>

Ответ 5

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

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

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

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

ViewData["Title"] = "Details";

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

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

Обратите внимание, что данные внутри являются одинаковыми

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

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

  • ViewBag не поддерживает недопустимые имена С#. вы не можете получить доступ к 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"]

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

In View:

@ViewBag.Name 
@ViewData["Name"] 

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

  • ViewData используется для передачи данных с контроллера для просмотра
  • ViewData получен из класса ViewDataDictionary и в основном является объектом словаря i.e.Keys и значениями, где Keys являются String, а значениями являются объекты.
  • Требуется типизация данных при извлечении данных из ViewData из-за его типа данных объекта, а также проверка нулевого значения valeue перед литьем типа, иначе он сломает приложение. Если перенаправление происходит, то его значение становится нулевым Прочтите полную разницу между TempData ViewData и View Bag.

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

Ответ 14

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

Ответ 15

Здесь и 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 - это пара, такая как Key и Value, Message - это Key, а в кавычках значение - Value.

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

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

--For Сложный тип использования 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 требует встраивания типов.

Ответ 16

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

Ответ 17

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

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

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

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

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

      ViewBag.Name = "Value"; 

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

          @ViewBag.Name

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

ViewData["Name"] = "Value";

и доступ к значению, подобному этому

 @ViewData["Name"] 

Подробнее нажмите здесь: