В чем разница между ViewData и ViewBag?
-
11-10-2019 - |
Вопрос
Я видел, как ViewBag
в MVC 3.Чем это отличается от ViewData
в MVC 2?
Решение
Он использует динамическую функцию C# 4.0. Он достигает той же цели, что и ViewData, и следует избегать в пользу использования сильно напечатанных моделей View (так же, как следует избегать ViewData).
Так что в основном это заменяет Волшебные струны:
ViewData["Foo"]
с Волшебные свойства:
ViewBag.Foo
для чего у вас нет безопасности времени компиляции.
Я продолжаю обвинять Microsoft, чтобы когда -либо представлять эту концепцию в MVC.
Название свойств чувствителен к корпусу.
Другие советы
Внутренне Viewbag Свойства хранятся как пары имени/значения в Словарь ViewData.
ПРИМЕЧАНИЕ. В большинстве предварительных версий MVC 3 свойство ViewBag было названо The ViewModel, как отмечено в этом фрагменте из выпуска 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". Вам не нужно определять какие-либо классы с сильным типом, чтобы использовать свойство 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:
Помогает поддерживать данные при переходе из контроллера для просмотра. Используется для передачи данных из контроллера в соответствующее представление. Короткий срок службы означает, что ценность становится нулевой, когда происходит перенаправление. Это связано с тем, что их цель состоит в том, чтобы обеспечить способ общаться между контроллерами и взглядами. Это механизм связи в вызове сервера.
Разница между 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
что является дезинформацией. Оба очень полезны для передачи данных из представлений к макету или частичным в представлениях (или 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
можно проверить на синтаксический чистящий ноль:ViewBag.Person?.Name
ViewData
иметь все свойства такого словаряContainsKey
,Add
, и т. д., чтобы вы могли использоватьViewData.Add("somekey", "somevalue")
Имейте в виду, что это может сделать исключения.- С использованием
ViewData
На взглядах необходимо типировать, покаViewBag
не.
Зная тонкие различия, использование того или иначе - это гораздо больше вкусового предпочтения.
Обычно вы можете думать о ViewBag.AnyKey
к псевдонию ViewData["AnyKey"]
Могу ли я порекомендовать вам не использовать?
Если вы хотите «отправить» данные на свой экран, отправьте сильно напечатанный объект (он же 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: Является ли словарь, используемый для хранения данных между представлением и контроллером, вам необходимо отменить объект View Data в соответствующую модель в представлении, чтобы иметь возможность извлекать из него данные ...
Viewbag: является динамическим свойством, сходным по своему рабочим с данным представления, однако лучше, потому что его не нужно подчиняться в свою модель Corressponding, прежде чем использовать ее в представлении ...
Ниже приведена разница в точке в отношении ViewData, Viewbag, Tempdata и Session.Credit/Socied AskforProgram.in , Перейдите по ссылке для примера кода, о котором я не упомянул здесь.
ViewData в MVC
- ViewData является свойством класса ControllerBase.
- ViewData является типом словарного объекта.
- ViewData-это коллекция словарей ключей.
- ViewData была введена в версии MVC 1.0.
- ViewData работает с .NET Framework 3.5 и выше.
- Нужно сделать преобразование кода типа при перечислении.
- Объект ViewData сохраняет данные только для текущего запроса.
Viewbag в MVC
- Viewbag - это свойство ControllerBase Class.
- 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 и выше.
- Нужно сделать преобразование кода типа при перечислении.
- Объект сеанса сохраняет данные для всех запросов. Действительно для всех запросов, никогда не истекает.
Хотя у вас может не быть технического преимущества в выборе одного формата над другим, вы должны знать о некоторых важных различиях между двумя синтаксисами. Одно очевидное отличие состоит в том, что Viewbag работает только тогда, когда ключ, к которому вы получаете доступ, является действительным C# Identifi Er. Например, если вы размещаете значение в ViewData [«Ключ с пробелами»], вы не можете получить доступ к этому значению, используя Viewbag, потому что код не компилируется. Другая ключевая проблема, которую следует учитывать, заключается в том, что вы не можете пройти в динамических значениях в качестве параметров методам расширения. Компилятор C# должен знать реальный тип каждого параметра во время компиляции, чтобы выбрать правильный метод расширения. Если какой -либо параметр является динамическим, компиляция потерпит неудачу. Например, этот код всегда будет сбой: @html.textbox ("name", viewbag.name). Чтобы обойти это, либо используйте ViewData ["name"], либо бросьте VA
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
Таким образом, мы можем заставить его использовать значения для передачи информации между контроллером на другую страницу с помощью данных Temp
Одно основное отличие, которое я заметил между ViewData и Viewbag:
ViewData: Он вернет объект, не имеет значения, что вы присвоили в этом, и вам нужно снова вернуть исходный тип.
Viewbag: Достаточно разумно вернуть точный тип того, что вы присвоили ему. Не имеет значения погоды, вы назначили простой тип (т.е. int, строка и т. Д.) или комплексный тип.
Пример: Код контроллера.
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>
Выходной экран.
Просмотреть данные
- ViewData используется для передачи данных из контроллера для просмотра
- ViewData получен из класса ViewDataDictionary и является в основном словарным объектом IEKEYS и значениями, где ключи являются строкой, а значения будут объектами.
- Данные тип необходимы при извлечении данных из ViewData из -за его типа объектов данных, а также NULL VVALUE Проверка BEFOR CASTING, в противном случае он нарушит приложение. Если происходит перенаправление, то его значение становится нулевой чтение полной разницы между Tempdata ViewData и View Bag
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
- ViewData используется для передачи данных из контроллера для просмотра
- Это получено из класса ViewDataDictionary
- Он доступен только для текущего запроса
- Требуется тип для сложного типа данных и проверки на нулевые значения, чтобы избежать ошибки
- Если происходит перенаправление, то его значение становится нулевым
- Viewbag также используется для передачи данных из контроллера в соответствующий вид
- Viewbag - это динамическое свойство, которое использует новые динамические функции в C# 4.0
- Он также доступен только для текущего запроса
- Если происходит перенаправление, то его значение становится нулевым
- Не требует типа для сложного типа данных
Здесь ViewData а также Viewbag оба используются передавать данные из Контроллер к Вид.
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();
}
- с учетом данных можно извлечь как
<ul>
@foreach (var items in (List<string>)ViewData["types"])
{
<li>@items</li>
}
</ul>
2. Viewbag
-Viewbag использует Dynamic Feature.viewbag Orbper вокруг ViewData.
- в виде вида типа требуется.
- То же, что и 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();
}
- с учетом данных можно извлечь как
<ul>
@foreach (var items in ViewBag.types)
{
<li>@items</li>
}
</ul>
- Основное отличие в том, что Viewbag не требуется тип, но ViewData Требуется тип.
ViewBag и ViewData - это два средства, которые используются для передачи информации от контроллера к представлению в ASP.Net MVC.Целью использования обоих механизмов является обеспечение связи между контроллером и представлением.Оба имеют короткий срок службы, то есть значение обоих становится нулевым после того, как произошло перенаправление, т. Е. как только страница перенаправляется с исходной страницы (где мы устанавливаем значение 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"]
Для получения более подробной информации нажмите здесь: