ViewBag es un diccionario dinámico. Por lo tanto, al usar ViewBag para transferir datos entre los métodos de acción y las vistas, su compilador no podrá detectar si usted hace un error en su código al intentar acceder al ítem ViewBag en su vista. Su vista se bloqueará en el tiempo de ejecución :(
En general, es una buena idea utilizar un modelo de vista para transferir datos entre sus métodos de acción y vistas. View model es una clase POCO simple que tiene propiedades específicas para la vista. si desea pasar algunos datos adicionales para ver, agregue una nueva propiedad a su modelo de vista y úselo. Las vistas muy tipeadas hacen que el código sea más limpio y más fácil de mantener. Con este enfoque, no es necesario que haga un casting explícito de su diccionario viewbag elemento para algunos tipos de ida y vuelta que usted tiene que ver con ver la bolsa.
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;}
}
y en su método de acción, cree un objeto de este modelo de vista, cargue las propiedades y enviar eso a la vista.
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);
}
Y su punto de vista, que es fuertemente tipado al modelo de vista, los datos
@model ProductsForCategoryVm
<h2>@Model.CategoryName</h2>
@foreach(var item in Model.Products)
{
<p>@item.Name</p>
}
desplegables?
Una gran cantidad de tutoriales/libros tiene muestras de código que utiliza ViewBag para datos desplegables. Personalmente todavía siento que ViewBag no debería usarse para esto. Debe ser una propiedad del tipo List<SelectListItem
> en su modelo de vista para pasar los datos desplegables. Aquí hay un post con un código de ejemplo sobre cómo hacerlo.
¿Hay situaciones en las que un ViewBag es absolutamente necesario?
Hay algunos casos de uso válidos donde se puede (no es necesario ) utiliza ViewBag para enviar datos. Por ejemplo, si desea mostrar algo en su página Diseño, puede usar ViewBag para eso. Otro ejemplo es ViewBag.Title
(para el título de la página) presente en la plantilla MVC predeterminada.
public ActionResult Create()
{
ViewBag.AnnouncementForEditors="Be careful";
return View();
}
Y en el diseño, se puede leer la ViewBag.AnnouncementForEditors
<body>
<h1>@ViewBag.AnnouncementForEditors</h1>
<div class="container body-content">
@RenderBody()
</div>
</body>
Desde la perspectiva de Microsoft, no estamos de acuerdo con nunca usar ViewBag o ViewBag es un No No. Usar ViewBag para pasar los datos del modelo es otro asunto y debe desaconsejarse. Usar ViewBag para pasar metadatos (Seleccionar lista) está bien. Pro MVC de Sanderson y otros libros los usan y no hacen tales proclamaciones definitivas - 2. Abs necesario - Lo dudo. – RickAndMSFT