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:
Y ya desde la vista, podíamos recuperar el valor así:
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:
Y desde la vista podríamos acceder a ellas de forma directa:
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:
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 tipoobject
, por lo que a veces debemos hacerles un cast para poder operar con ellos; las propiedades dinámicas delViewBag
se crean con el tipo apropiado, facilitanto así su manipulación posterior:
ViewModel
” en Controladores y “View
” en vistas).
Aoy nuevo en MVC, pero cuando dice vistas de tipado fuerte se refiere a un tipo de objeto?,
Cuando se necesitan datos de diferentes tipos de entidad como se debe hacer con tipado fuerte?
Hola!
Si quieres que una vista tipada incluya objetos de distintos tipos, puedes recurrir al patrón conocido como ViewModel.
Esto significa, en la práctica, usar composición: si desde el controlador quieres enviar a la vista un objeto A y otro B usando tipado fuerte, basta con crear una clase C con dos propiedades, una de tipo A y otra B. Lo que pasarías a la vista es el objeto de tipo C, desde el cual se podría acceder a A y B.
Saludos!