Я видел ViewBag
в MVC 3. Как это отличается от ViewData
в MVC 2?В чем разница между ViewData и ViewBag?
ответ
Он использует динамическую функцию C# 4.0. Он достигает той же цели, что и viewdata, и его следует избегать в пользу использования сильно типизированных моделей представлений (так же, как viewdata следует избегать).
Так в основном он заменяет волшебные строки:
ViewData["Foo"]
с магическими свойствами:
ViewBag.Foo
, для которого у вас нет безопасности во время компиляции.
Я по-прежнему обвиняю Microsoft навсегда представить эту концепцию в MVC.
Имя свойства чувствительно к регистру.
Есть несколько тонких различий, которые означают, что вы можете использовать ViewData и ViewBag несколькими способами из представления. Одно из преимуществ приведено в этом сообщении http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx и показывает, что в примере можно исключить использование кастомизации, используя ViewBag вместо ViewData.
Внутренне ViewBag свойства хранятся в виде пар имя/значение в словаре ViewData.
Примечание: в большинстве предварительных версий в MVC 3, свойство ViewBag было названо ViewModel, как указано в этом фрагменте из MVC примечания 3 выпуска:
(под редакцией 10-8-12) Это было предложил мне создать источник этой информации я отправил, вот источник: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
MVC 2 контроллеры поддерживают ViewData свойство, которое позволяет передавать данные в шаблоне вида с помощью позднего связывания Dictiona ry API. В MVC 3 вы также можете использовать более простой синтаксис с ViewBag для достижения цели . Например, вместо записи ViewData ["Message"] = "text", вы можете написать ViewBag.Message = "text". Вам не нужно определять классы строго типизированных классов , чтобы использовать свойство ViewBag . Поскольку это динамическое свойство , вы можете вместо этого просто получить или установить свойства, и оно будет решить их динамически во время выполнения. Внутренне, свойства ViewBag: хранятся как пары имя/значение в ViewData dictionary. (Примечание: в большинстве предварительных версий в MVC 3, ViewBag свойство было названо ViewModel свойства .)
Вопрос задает разницу между 'ViewData' и' ViewBag', а не 'ViewModel'. –
Спасибо за хедз-ап Мэтью Флашен, у меня была опечатка в ответе и исправлена, теперь читается «ViewData» вместо ViewModel, что было ошибкой. :) –
Теперь это неверно. Ни один из них не был переименован в другой. Оба они все еще существуют. Один из них является «динамическим» и поддерживает «ViewBag.Message». Один использует старый синтаксис 'ViewData [" Message "]'. –
Могу ли я рекомендую вам не использовать либо?
Если вы хотите «отправить» данные на свой экран, отправьте строго типизированный объект (A.K.A. ViewModel), потому что его легче протестировать.
Если вы привязаны к какой-то «Модели» и имеете случайные предметы «viewbag» или «viewdata», то это затрудняет автоматическое тестирование.
Если вы используете их, рассмотрите, как вы можете реструктурировать и просто использовать ViewModels.
Игнорирование принципала «компилятор является первым модульным тестом», как модель статически типизированного представления делает ваш код более проверяемым, чем динамический? Хотя требование для тестов более важно в динамически типизированном решении, если оба решения реализуют одинаковое количество и тип тестов, вы ничего не теряете. –
Согласен, это немного расплывчато. Возможно, задействован intellisense. –
Один пример был бы насмешкой. Если вы хотите, чтобы подразделение тестировало действие контроллера, проще создать объект «mock» для передачи и утверждения против, а не пытаться утверждать, что какая-то строка была добавлена в какой-либо словарь или какое-то динамическое поле установлено на какое-то значение - это аналогичная концепция для контрактов на обслуживание, имеющая один «запрос» и один объект «Ответ», вместо того, чтобы принимать несколько параметров. – nootn
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.emp.Name</h4>
<h3>@viewDataEmployee.Name</h3>
помогите мне разобраться, но я думаю, что есть ошибка. это '
@ ViewBag.emp.Name
' должен измениться на '@ ViewBag.Employee.Name
' –ViewBag против ViewData в MVC
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
Сходства между ViewBag & ViewData:
Помогает сохранить данные при переходе от контроллера для просмотра. Используется для передает данные с контроллера на соответствующее представление. Короткий срок службы означает значение становится null при перенаправлении. Это связано с тем, что их цель - обеспечить способ связи между контроллерами и представлениями. Это механизм связи в вызове сервера.
Разница между ViewBag & ViewData:
ViewData является словарем объектов, является производным от ViewDataDictionary класса и доступных с использованием строк в качестве ключей. ViewBag - динамическое свойство, которое использует преимущества новых динамических функций в C# 4.0. ViewData требует типизации для сложного типа данных, а проверяет наличие нулевых значений во избежание ошибок. ViewBag не требует typecasting для сложного типа данных.
ViewBag & ViewData Пример:
public ActionResult Index()
{
ViewBag.Name = "Arun Prakash";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Arun Prakash";
return View();
}
Вызов в View
@ViewBag.Name
@ViewData["Name"]
ответ указывают на 'typecasting' но не показали, как типажей выполняется – Alex
ViewData: является словарь, используемый для хранения данных между видом и контроллер, и нужно подавать объект данных представления к его соответствующей модели в представлении, чтобы иметь возможность извлекать данные из него ...
ViewBag: это динамическое свойство похоже на его работы с данными зрения, однако это лучше Потому что это не нужно быть литыми его corressponding модели, прежде чем использовать его в представлении ...
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
ViewBag и ViewData - это два средства, которые используются для передачи информации от контроллера для просмотра в ASP.Net MVC. Цель использования обоих механизмов - обеспечить связь между контроллером и представлением. Оба имеют короткий срок службы, значение которого становится равным нулю после того, как произошло перенаправление, то есть, как только страница перенаправила с исходной страницы (где мы установили значение ViewBag или ViewData) на целевую страницу, как ViewBag, так и ViewData становится null.
Несмотря на то, что эти сходства (ViewBag и ViewData) являются двумя, если мы говорим о реализации обоих. Различия заключаются в следующем:
1.) Если мы проанализируем мудрую реализацию, то мы увидим, что ViewData - это структура данных словаря - Словарь объектов, полученный из ViewDataDictionary, и доступный с использованием строк в качестве ключей к этим значениям, в то время как ViewBag использует динамических функций, введенных в C# 4.0, и является динамическим свойством.
2.) При обращении к значениям формы ViewData нам необходимо вывести значения (типы данных), поскольку они хранятся как объекты в словаре ViewData, но нет такой необходимости, если мы обращаемся к th-значению в случае ViewBag.
3.) В ViewBag мы можем установить значение вроде этого:
ViewBag.Name = "Value";
и может получить доступ к следующим образом:
@ViewBag.Name
В то время как в случае ViewData значения могут быть установлены и доступны как следующим образом: Установка ViewData следующим образом:
ViewData["Name"] = "Value";
и доступа к стоимости Li ке это
@ViewData["Name"]
Для получения более подробной информации click here:
жаль, что я downvoted, но этот ответ занимает несколько абзацев сказать ничего полезного. Полезной вещью, отсутствующей в принятом ответе, будет предложение «viewbag - это динамическая оболочка вокруг viewdata», которую я узнал из http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp .net-MVC-3-приложения –
Таким образом, мы можем сделать его использовать значения в передачи информации между контроллером на другую страницу с TEMP DATA
Все ответы предполагают, что 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
может проверить NULLS синтаксической очистителя:ViewBag.Person?.Name
ViewData
имеют все свойства словаря, какContainsKey
,Add
и т.д., так что вы можете использоватьViewData.Add("somekey", "somevalue")
иметь в виду, что это может вызвать исключения.- Использование
ViewData
на просмотрах требует TypeCasting в то время какViewBag
нет.
Зная тонкие различия, используя ту или иную сторону, вы предпочитаете больше вкуса.
Обычно вы можете думать о ViewBag.AnyKey
на псевдоним ViewData["AnyKey"]
Хотя вы не можете иметь техническое преимущество в выборе один формат других, вы должны знать о некоторых важных различиях между этими двумя синтаксисами. Очевидным отличием является то, что ViewBag работает только тогда, когда ключ, к которому вы обращаетесь , является действительным идентификатором C#. Например, если вы поместите значение в ViewData ["Key With Spaces"], вы не сможете получить доступ к этому значению с помощью ViewBag, потому что код не будет компилироваться. Еще одна важная проблема, которую следует учитывать, заключается в том, что вы не можете передавать динамические значения в качестве параметров методам расширения. Компилятор C# должен знать реальный тип каждого параметра во время компиляции, чтобы выбрать правильный метод расширения. Если какой-либо параметр является динамическим, компиляция завершится с ошибкой. Например, этот код будет всегда терпеть неудачу: @ Html.TextBox («name», ViewBag.Name).Чтобы обойти эту проблему, либо использование ViewData [ «Name»] или закиньте Va
Одно основное различие я заметил между ViewData и ViewBag является:
ViewData: он возвращает объект не имеет значения, что вы назначили в это, и нужно снова приложить к исходному типу.
ViewBag: достаточно разумно возвращать точный тип, который вы ему назначили, не имеет значения, когда вы присвоили простой тип (т. Е. Int, string и т. Д.) Или сложный тип.
Ex: Код контроллера.
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; }
}
}
View Code.
<ul>
@foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
{
<li>@item.productId @item.productName</li>
}
</ul>
выводимые на экран.
Просмотр данных
- ViewData используется для передачи данных от контроллера для просмотра
- ViewData является производным от класса ViewDataDictionary и в основном словарь объектов ieKeys и ценности где Keys - String, а значения - объекты.
- При отправке данных из вида ViewData из-за своего типа данных объекта, а также проверки нулевого значения valeue перед тем, как выполнять кастинг, в противном случае это приведет к поломке приложения. Если происходит перенаправление, то его значение становится нулевым Читать полную разницу между TempData ViewData и видом сумка
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
Для какой цели вы обвиняете Microsoft? Если нет viewdata, как мы можем связать dropdownlist с моделью. (Я не думаю, что использование selectlist внутри модели было бы хорошей идеей) –
@SubinJacob Вы должны действительно задать новый вопрос, если хотите получить ответ на этот вопрос. Создание SelectList - это определенно способ сделать выпадающий список. – MiniRagnarok
@SubinJacob, я полагаю, он обвиняет MS в представлении динамических функций. – MEMark