В чем разница между 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, перейдите по ссылке для примера кода, который я не упомянул здесь.
ViewData в MVC
- ViewData является свойством класса ControllerBase.
- ViewData - это тип объекта словаря.
- ViewData - это словарь-коллекция ключей.
- ViewData была представлена в версии MVC 1.0.
- ViewData работает с.Net Framework 3.5 и выше.
- Необходимо сделать преобразование типа кода при перечислении.
- Объект ViewData хранит данные только для текущего запроса.
ViewBag в MVC
- ViewBag является свойством класса ControllerBase.
- ViewBag - это тип динамического объекта.
- ViewBag - это тип объекта.
- ViewBag был представлен в версии MVC 3.0.
- ViewBag работает с.Net Framework 4.0 и выше.
- ViewBag использует свойство и обрабатывает его, поэтому нет необходимости выполнять преобразование типов при перечислении.
- Объект ViewBag хранит данные только для текущего запроса.
TempData в MVC
- TempData является свойством класса ControllerBase.
- TempData - это тип объекта словаря.
- TempData - это словарь-ключ.
- TempData была введена в версии MVC 1.0.
- TempData работает с.Net Framework 3.5 и выше.
- Необходимо сделать преобразование типа кода при перечислении.
- Объект TempData используется для данных между текущим запросом и последующим запросом.
Сессия в 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 используется для передачи данных из контроллера для просмотра
- Он является производным от класса ViewDataDictionary
- Доступно только для текущего запроса
- Требуется приведение типов для сложного типа данных и проверка на нулевые значения, чтобы избежать ошибок
- Если происходит перенаправление, его значение становится нулевым
- ViewBag также используется для передачи данных из контроллера в соответствующее представление
- ViewBag - это динамическое свойство, использующее преимущества новых динамических функций в C# 4.0.
- Он также доступен только для текущего запроса
- Если происходит перенаправление, его значение становится нулевым
- Не требует преобразования типов для сложного типа данных
Таким образом, мы можем заставить его использовать значения для передачи информации между контроллером на другую страницу с 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 @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"]
Просмотр данных
- ViewData используется для передачи данных из контроллера для просмотра
- ViewData является производным от класса ViewDataDictionary и в основном представляет собой объект Dictionary, т.е. ключи и значения, где ключи представляют собой строку, а значения - объекты.
- Типизация данных требуется при извлечении данных из ViewData из-за его типа данных объекта, а также проверки нулевого значения перед приведением типа, в противном случае это нарушит работу приложения. Если происходит перенаправление, то его значение становится равным нулю. Читать всю разницу между TempData ViewData и View Bag.
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
ViewBag
- Он возвращает объект типа.
- Это свойство класса.
- работает только с .NET Framework 4.0 и выше.
- Перед использованием не требуется TypeCasting, так как свойство заложено в природе.
- возвращает объект динамического типа, и его свойства также
dynamic
. - Это немного быстрее, чем.
ViewData
- Он возвращает парную коллекцию словаря «ключ-значение».
- это объект словаря, и это свойство
ControllerBase
класс. - быстрее чем
ViewBag
. - При перечислении требуется код преобразования типа, так как это Коллекции пар словарей.
-
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"]
Для более подробной информации нажмите здесь: