ViewBag - динамический словарь. Поэтому при использовании ViewBag для передачи данных между методами действий и представлениями ваш компилятор не сможет поймать, если вы делаете опечатку в своем коде при попытке получить доступ к элементу ViewBag в своем представлении. Ваше представление будет сбой во время выполнения :(
Как правило, рекомендуется использовать модель представления для передачи данных между вашими методами действий и представлениями. View model - это простой класс POCO, который обладает свойствами, специфичными для представления. если вы хотите передать некоторые дополнительные данные для просмотра, добавьте новое свойство в свою модель просмотра и используйте это. Сильно напечатанные представления делают код более чистым и более простым в обслуживании. При таком подходе вам не нужно делать явное литье ваш viewbag элемент словаря для некоторых типов назад и вперед, которые вы должны сделать с видом сумки.
public class ProductsForCategoryVm
{
public string CategoryName { set;get; }
public List<ProductVm> Products { set;get;}
}
public class ProductVm
{
public int Id {set;get;}
public string Name { set;get;}
}
и в методе действия, создать объект этой точки зрения модели, загрузить свойства и отправить его в представлении.
public ActionResult Category(int id)
{
var vm= new ProductsForCategoryVm();
vm.CategoryName = "Books";
vm.Products= new List<ProductVm> {
new ProductVm { Id=1, Name="The Pragmatic Programmer" },
new ProductVm { Id=2, Name="Clean Code" }
}
return View(vm);
}
И ваша точка зрения, которая сильно типизированных к модели представления,
@model ProductsForCategoryVm
<h2>@Model.CategoryName</h2>
@foreach(var item in Model.Products)
{
<p>@item.Name</p>
}
DropDown данные?
Много учебников/книг содержит образцы кода, которые используют ViewBag для выпадающих данных. Я лично все еще чувствую, что ViewBag не следует использовать для этого. Он должен быть свойством типа List<SelectListItem
> в вашей модели просмотра, чтобы передать выпадающие данные. Вот post с примером кода о том, как это сделать.
Существуют ли ситуации, когда ViewBag абсолютно необходим?
Есть некоторые действительные случаи использования, где вы можете (не нужно) использовать ViewBag для передачи данных. Например, вы хотите отобразить что-то на странице Layout, для этого вы можете использовать ViewBag. Другим примером является ViewBag.Title
(для заголовка страницы), присутствующего в шаблоне MVC по умолчанию.
public ActionResult Create()
{
ViewBag.AnnouncementForEditors="Be careful";
return View();
}
И в макете, вы можете прочитать ViewBag.AnnouncementForEditors
<body>
<h1>@ViewBag.AnnouncementForEditors</h1>
<div class="container body-content">
@RenderBody()
</div>
</body>
С точки зрения Microsoft, мы не согласны с тем, чтобы никогда не использовать ViewBag или ViewBag - No No. Использование ViewBag для передачи данных модели - другое дело и должно быть обескуражено. Использование ViewBag для передачи метаданных (Select List) отлично. Pro MVC от Sanderson и других книг используют их и не делают таких окончательных прокламаций - 2. Abs необходимо - я сомневаюсь. – RickAndMSFT