Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 14 de diciembre de 2010
Las versiones 1 y 2 de ASP.NET MVC permitían el paso de datos desde el Controlador a la Vista a través del diccionario ViewData, de la siguiente forma:

Uso de ViewData en el Controlador

Y ya desde la vista, podíamos recuperar el valor así:

Uso del ViewData desde la Vista

ASP.NET MVC 3 sigue manteniendo este comportamiento, pero ha añadido un mecanismo adicional para facilitar esta tarea: el ViewBag. Se trata de un objeto dinámico disponible tanto en los controladores como en las vistas, sobre el que podemos ir definiendo propiedades sin necesidad de que éstas estén definidas previamente:

Uso del ViewBag desde el Controlador

Y desde la vista podríamos acceder a ellas de forma directa:

Uso del ViewBag desde la vista

A la vista de los ejemplos, podría parecer que ViewBag y ViewData son dos “sacos” diferentes para pasar información desde la capa Controlador a la capa Vista. Sin embargo, aunque bajo distintas denominaciones, están en realidad accediendo al mismo conjunto de datos. Por ejemplo, el siguiente código resultaría equivalente al anterior:

ViewBag y ViewData

Probablemente os preguntaréis qué aporta el nuevo ViewBag sobre el tradicional ViewData. Desde mi punto de vista son varias:
  • en primer lugar, permite un código más compacto y rápido de escribir,
  • elimina las temidas magic strings propias del diccionario ViewData,
  • como consecuencia, podríamos beneficiarnos (aunque de momento no he visto que sea así) de refactorizaciones o intellisense sobre estos miembros,
  • facilita el cambio de tipos. Los elementos de ViewData son siempre de tipo object, por lo que a veces debemos hacerles un cast para poder operar con ellos; las propiedades dinámicas del ViewBag se crean con el tipo apropiado, facilitanto así su manipulación posterior:

Acceso tipado a las propiedades del ViewBag

En definitiva, una nueva característica que ya podemos utilizar en las versiones preliminares de MVC 3 (aunque hasta la RC2 bajo otra denominación, “ViewModel” en Controladores y “View” en vistas).

Personalmente no me aporta demasiado, pues sigo prefiriendo el uso de vistas con tipado fuerte, pero bueno, está bien saber que existe por si nos puede ser útil en algún momento.

Publicado en: Variable not found.

4 Comentarios:

Fernando Ponti dijo...

Estupendo artículo. Pero me surge una duda por desconocimiento de esta tecnología.

Supongamos que debemos mostrar un dato en un párrafo html, pero si ese dato no cumple una regla no se mostrará al usuario y por consiguiente tampoco se mostrará el párrafo html vacío.

¿La forma de proceder es concatenar en la instrucción el propio código html?, es decir:

Viewbag.nombre ='Nombre Autor'

Se que la pregunta puede ser obvia pero desconozco esta tecnología y no se si hay alternativas.

Muchas gracias.

josé M. Aguilar dijo...

Hola, Fernando.

Observa que estás hablando de lógica de presentación, por lo que este "if" debería ir en los componentes de la capa vista (la "V" de MVC).

En MVC3 y con Razor, tendrías en la vista un código como el siguiente:

@if(!string.IsNullOrEmpty(nombre))
{
<p>@nombre</p>
}

En este caso, si la variable "nombre" está en blanco, no se mostrará nada; en caso contrario, se mostrará un párrafo con su valor.

Saludos!

Fernando Ponti dijo...

Muchas gracias por tu respuesta.
Es que tengo especial interés en conseguir separar al máximo la presentación html de la funcionalidad de servidor.
Ahora mismo tengo un "apaño" montado en ASP 4.0 de forma que el diseñador puede editar a placer los archivos html y mediante unas etiquetas el servidor ejecuta las funciones correspondientes y devuelve los datos con su "envoltorio" html.
De la forma que me comentas, haciendo los ifs en la propia vista pierdo parte de esa independencia y lastro al diseñador.
Supongo que la mejor manera de conseguir lo que necesito estaría en usar los ViewModel.

Gracias por tu tiempo.
Un cordial saludo.

Unknown dijo...

Saludos, quisiera saber si me puedes ayudar con un problema q tngo, quisiera poder leer un List que lo envio mediante un ViewBag desde el controlador y poder obtenerlo y leerlo en la vista con jquery y razor. Muchas gracias si puedes ayudarme