Я видел ViewBag
в MVC 3. Как это отличается от ViewData
в MVC 2?
Какая разница между ViewData и ViewBag?
Ответ 1
Он использует динамическую функцию С# 4.0. Он достигает той же цели, что и viewdata, и его следует избегать в пользу использования сильно типизированных моделей представлений (так же, как viewdata следует избегать).
Таким образом, в основном он заменяет магические строки:
ViewData["Foo"]
с магическими свойствами:
ViewBag.Foo
для которого у вас нет безопасности времени компиляции.
Я продолжаю обвинять Microsoft в том, что она когда-либо представляла эту концепцию в MVC.
Имя свойства чувствительно к регистру.
Ответ 2
Внутренне Свойства ViewBag сохраняются как пары имя/значение в словаре ViewDatastrong > .
Примечание. В большинстве предварительных версий 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 @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- ViewData используется для передачи данных из контроллера для просмотра
- Он является производным от класса ViewDataDictionary
- Доступно только для текущего запроса
- Требуется приведение типов для сложного типа данных и проверка на нулевые значения, чтобы избежать ошибок
- Если происходит перенаправление, его значение становится нулевым
- ViewBag также используется для передачи данных из контроллера в соответствующее представление
- ViewBag - это динамическое свойство, использующее преимущества новых динамических функций в С# 4.0.
- Он также доступен только для текущего запроса
- Если происходит перенаправление, его значение становится нулевым
- Не требует преобразования типов для сложного типа данных
Ответ 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, перейдите по ссылке для примера кода, который я не упомянул здесь.
-
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 и выше.
- Необходимо сделать преобразование типа кода при перечислении.
- Объект сеанса хранит данные для всех запросов. Действительно для всех запросов, никогда не истекает.
Ответ 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"]
Подробнее нажмите здесь: