que net mvc how from example data asp asp.net-mvc razor viewbag

asp.net-mvc - net - viewbag in view mvc



Mejores prácticas de MVC ViewBag (9)

Para ViewBag, escuché que era un no-no para usar. ¿Asumiría que el contenido del ViewBag debería incorporarse en un modelo de vista?

Pregunta:

  1. Es mi suposición por encima de la mejor práctica. (No usar ViewBag y segundo para tenerlo en el modelo de vista)

  2. ¿Hay situaciones en las que ViewBag es absolutamente necesario?


1) ¿Mi suposición está por encima de la mejor práctica? (No usar ViewBag y segundo para tenerlo en el modelo de vista)

Debe usar viewmodels en lugar de pasar datos a través de ViewBag tanto como sea posible.

2) ¿Hay situaciones en las que ViewBag es absolutamente necesario?

No hay ninguna situación en la que ViewBag sea absolutamente necesario. Sin embargo, hay algunos datos que personalmente prefiero usar ViewBag en lugar de View Model. Por ejemplo, cuando necesito llenar un cuadro desplegable para valores predefinidos (es decir, Ciudades), uso ViewBag para llevar a la vista la matriz SelectListItem. Prefiero no contaminar mis ViewModels con estos datos.


1) ¿Mi suposición está por encima de la mejor práctica? (No usar ViewBag y segundo para tenerlo en el modelo de vista)

Sí.

2) ¿Hay situaciones en las que ViewBag es absolutamente necesario?

No. Todo lo que haya almacenado en una ViewBag podría ir al modelo de vista que se pasó a la vista.


2. ¿Hay situaciones en las que ViewBag es absolutamente necesario?

En algún caso, deberá compartir sus datos desde el Controlador a través de los diseños, vistas y vistas parciales. En este caso, ViewBag es muy útil y dudo que haya una mejor manera.


  1. No. Use ViewModels .
  2. No. Si diseñas un modelo de vista perfecto, nunca necesitas un ViewBag.

El problema con ViewBags y la mejor práctica recomendada se reduce a la verificación del tiempo de compilación. ViewBags son solo diccionarios y con eso obtienes cadenas mágicas, por lo que si terminas cambiando el tipo de objeto de uno de los elementos del viewbag o el nombre de la clave, no lo sabrás hasta el tiempo de ejecución, incluso si precompilas las vistas con <MvcBuildViews>true</MvcBuildViews> .

Permanecer a la vista de los modelos es lo mejor, incluso si tiene que modificarlos para adaptarlos a una vista específica de vez en cuando.


He encontrado algo de uso para ViewBag donde hay funcionalidad común en todas las páginas, y la funcionalidad no depende de la página que se muestra. Por ejemplo, supongamos que está creando . El tablero de trabajo aparece en cada página, pero los trabajos que se muestran no tienen nada que ver con la página (mi uso fue similar en concepto). Agregar una propiedad a cada ViewModel sería difícil y tomaría mucho tiempo, y una gran cantidad de pelusa para sus pruebas. No creo que valga la pena en esta situación.

Utilicé una clase base ViewModel con los datos de corte transversal, pero si tiene más de uno (por ejemplo, trabajos y una lista de sitios de intercambio de pila), debe comenzar a rellenar datos adicionales, o algún otro abuso de un ViewModel, más necesita un constructor ViewModel para rellenar los datos base.

En cuanto al problema de las cuerdas mágicas, hay muchas soluciones. Constantes, métodos de extensión, etc.

Con todo lo dicho, si tiene algo que se muestra en su página que depende del contexto de la página, un ViewModel es su amigo.

Erick


Si no hubiera casos de uso para él, no se implementaría en primer lugar. Sí, puedes hacer todo con ViewModels, pero ¿qué pasa si realmente no necesitas uno? Uno de esos escenarios es editar entidades. Puede pasar DTO directamente como modelo.

@model CategoryDto <div class="md-form form-sm"> <input asp-for="Name" class="form-control"> <label asp-for="Name">("Category Name")</label> </div>

Pero, ¿y si quieres seleccionar Categoría padre? La entidad DTO tiene, idealmente, solo sus propios valores, por lo que para completar la lista de selección, utiliza ViewBag.

<select asp-for="ParentId" asp-items="ViewBag.ParentList"> <option value="">None</option> </select>

¿Por qué hacer esto? Bueno, si tiene 50 tipos de entidades, cada una con algún tipo de selección de diferentes valores, simplemente evitó crear 50 ViewModels adicionales.


Si no puede rediseñar el ViewModel EXISTENTE, use ViewBag.


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. Tu vista se bloqueará en el tiempo de ejecución :(

En general, es una buena idea usar 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. Por lo tanto, 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 realizar una conversión explícita de su elemento de diccionario de viewbag a algunos tipos de ida y vuelta que tiene que ver con la vista de 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 envíe 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 vista, que está fuertemente tipada al modelo de vista,

@model ProductsForCategoryVm <h2>@Model.CategoryName</h2> @foreach(var item in Model.Products) { <p>@item.Name</p> }

Datos desplegables?

Una gran cantidad de tutoriales / libros tiene muestras de código que utiliza ViewBag para los datos desplegables. Personalmente todavía siento que ViewBag no debería usarse para esto. Debería ser una propiedad de tipo List<SelectListItem > en su modelo de vista para pasar los datos desplegables. Aquí hay una post con código de ejemplo sobre cómo hacer eso.

¿Hay situaciones en las que ViewBag es absolutamente necesario?

Hay algunos casos de uso válidos donde puede ( no es necesario ) usar 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, puede leer ViewBag.AnnouncementForEditors

<body> <h1>@ViewBag.AnnouncementForEditors</h1> <div class="container body-content"> @RenderBody() </div> </body>