Я бачив ViewBag
в MVC 3. Як це відрізняється від ViewData
MVC 2?
Я бачив ViewBag
в MVC 3. Як це відрізняється від ViewData
MVC 2?
Відповіді:
Він використовує динамічну функцію C # 4.0. Він досягає тієї самої мети, що і viewdata, і її слід уникати на користь використання сильно набраних моделей перегляду (так само, як слід уникати 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#_Toc2_4
Контролери MVC 2 підтримують властивість ViewData, яка дозволяє передавати дані до шаблону перегляду за допомогою API-інтерфейсу словника пізнього зв’язку. У MVC 3 ви також можете використовувати дещо простіший синтаксис із властивістю ViewBag для досягнення тієї ж мети. Наприклад, замість того, щоб написати ViewData ["Повідомлення"] = "текст", ви можете написати ViewBag.Message = "текст". Вам не потрібно визначати будь-які сильно типізовані класи, щоб використовувати властивість ViewBag. Оскільки це динамічна властивість, ви можете замість цього просто отримати або встановити властивості, і це буде динамічно вирішувати їх під час виконання. Внутрішньо властивості ViewBag зберігаються як пари імен / значень у словнику ViewData. (Примітка: у більшості попередніх версій MVC 3 властивість ViewBag отримало назву властивості ViewModel.)
ViewData
а ViewBag
не про ViewModel
.
dynamic
і підтримує ViewBag.Message
. В одному використовується старий ViewData["Message"]
синтаксис.
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"]
typecasting
але Ви не показували, як виконується
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>
<h4>@ViewBag.emp.Name</h4>
має змінитися на<h4>@ViewBag.Employee.Name</h4>
Всі відповіді свідчать про те , що ViewBag
і / або ViewData
є передача даних Controller
в Views
якій дезінформація. обидва дуже корисні для передачі даних із "Переглядів" у "Макет" або "Частково" в "Перегляди" (або "Перегляд компонентів" тощо). Це не виключно контролер.
як зразок 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
для перегляду потребує TypeCasting, а ViewBag
ні.Знання тонких відмінностей, використання тих чи інших - набагато більше смакових переваг.
Зазвичай ви можете придумати ViewBag.AnyKey
собі псевдонімViewData["AnyKey"]
Чи можу я рекомендувати вам не використовувати жодне з них?
Якщо ви хочете "надіслати" дані на екран, надішліть сильно набраний об'єкт (AKA ViewModel), тому що це простіше перевірити.
Якщо ви прив'язуєтесь до якогось типу "Модель" і маєте випадкові елементи "панелі перегляду" або "перегляду даних", то це робить автоматичне тестування дуже важким.
Якщо ви користуєтесь цими, розгляньте, як ви могли б реструктуруватись та просто скористайтеся 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 і контролером, вам потрібно передати об’єкт даних подання у відповідну модель у представленні, щоб мати змогу отримати дані з нього ...
ViewBag: це динамічна властивість, схожа за своєю роботою з даними перегляду, однак краще, тому що її не потрібно відкидати на свою модель корреспонденції, перш ніж використовувати її для перегляду ...
Нижче наведено різницю щодо точки зору ViewData, ViewBag, TempData та сесії. Кредит / скопійовано askforprogram.in , перейдіть за посиланням для прикладу коду, який я тут не згадував.
ViewData в MVC
ViewBag в MVC
TempData в MVC
Сесія в MVC
Хоча у вас не може бути технічної переваги щодо вибору одного формату над іншим, ви повинні знати про деякі важливі відмінності між двома синтаксисами. Одне очевидною відмінністю є те, що ViewBag працює лише тоді, коли ключ, до якого ви звертаєтесь, є дійсним ідентифікатором C #. Наприклад, якщо розмістити значення в ViewData ["Key With Spaces"], ви не можете отримати доступ до цього значення за допомогою ViewBag, оскільки код не буде компілюватися. Ще одна ключова проблема, яку слід врахувати, - це те, що ви не можете передати динамічні значення як параметри методам розширення. Компілятор C # повинен знати реальний тип кожного параметра під час компіляції, щоб вибрати правильний метод розширення. Якщо будь-який параметр динамічний, компіляція не вдасться. Наприклад, цей код завжди вийде з ладу: @ Html.TextBox ("ім'я", ViewBag.Name). Щоб вирішити це, скористайтеся ViewData ["Ім'я"
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 DATA
Одна з головних відмінностей, яку я помітив між 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.
Перегляд даних
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
Тут 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 є така пара, як Ключ і Значення , Повідомлення є Ключовим, а перевернута кома - Значення.
- Дані прості, тому ми не можемо використовувати тут typecasting, якщо дані складні, тоді використовуємо кастинг типів.
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 потрібна введення тексту .
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"]
Детальніше натисніть тут: