Vistas & View Engines en ASP.NET MVC

Partiendo de que la intención de MVC es separar las responsabilidades de cada componente, me gustaría explicar cual es la responsabilidad de las vistas y como utilizarlas en ASP.NET MVC.

Lo que primero nos choca a los programadores que procedemos de los formularios web, es que han desaparecido los eventos y el famoso ciclo de vida, y eso se debe precisamente que ASP.NET MVC es mucho más natural en los protocolos HTTP y HTML en su tratamiento.

Mvc vs WebForms

Como se puede apreciar en la imagen los formularios web se basaban en los eventos para procesar una petición, entrar en el ciclo de vida del documento, tratar el evento, pintar los controles y devolver el resultado.

Sin embargo las peticiones en MVC son mucho mas simples y respetuosas con el protocolo HTTP. La petición la recibe el motor de rutas que mediante la URL decide cual es el controlador que la debe procesar, el Controlador puede consultar al modelo si es necesario y posteriormente  devuelve un ActionResult  que puede ser un fichero, datos en formato JSon, una vista, etc.

Vistas

Como ya he comentado la vista encapsula la lógica de presentación y NO tiene que contener lógica de la aplicación ni código de recuperación de datos.

Las vistas no son ficheros físicos ligados a una URL como en los formularios web. Cuando queríamos consultar un formulario teníamos que poner su ruta física http://www.miaplicacion/personas.aspx En MVC es el controlador el que decide que vista servir y eso facilita que las url sean descriptivas y que los buscadores puedan indexar mejor las páginas de nuestra aplicación «SEO Friendly«.

ViewBag:

Las vistas pueden recibir datos desde el controlador gracias al ViewBag que devuelve un diccionario de datos dinámicos. La gran diferencia con ViewData de las versiones anteriores de MVC,  es que ViewBag aprovecha la opción de c#4 para generar tipos dinámicamente y evita tener que hacer conversiones en la vista para obtener el tipo adecuado de los datos.

En el Controlador: Definimos la propiedad que queremos pasar a la vista y el dato

ViewBag.Message = "Welcome to ASP.NET MVC!";

En la vista: desde la vista recuperamos el dato de una forma muy fácil.

<h2>@ViewBag.Message</h2>

ViewData vs ViewBag: la gran diferencia es que ya no tenemos la necesidad de hacer conversiones de los datos para poder tratarlos correctamente

@*Tipo Fecha con tipos dinámicos*@</pre>
<h1>@ViewBag.FechaVieBag.ToShortDateString()</h1>
<pre>

@*Tipo Fecha con ViewData*@</pre>
<h1>@(((DateTime)ViewData["Fecha"]).ToShortDateString())</h1>
<pre>

Tipos de Vistas de las que disponemos:

    • View Page: Vista principal.
    • LayoutView: Pagina Maestra.
    • ViewContentPage: Vista que utiliza una página Maestra predefinida.
    • Partial View: Vista que se utiliza desde otra vista y no se puede llamar directamente. Como se utilizaban los user controls en los webForms. La vista parcial tiene acceso a su ViewData y al dela vista primaria, pero las actualizaciones de los datos de la vista parcial solo afectan a su viewData y no a la de la vista primaria.

View Engines

ASP.NET MVC utiliza view engines para generar las vistas y desde MVC3 disponemos de dos motores de vistas incluidos para utilizar directamente.

  • ASPX:  Es el motor de vistas de ASP.NET con tipos personalizados «ViewPage, ViewMasterPage y ViewUserControl» que heredan  de los tipos  de páginas existentes .aspx, .ascx, .master.
  • Razor: Motor de vistas más cercano para los programadores de C# o VB
  • Otros:

Convenciones

Hay un par de convenciones que nos afectan al trabajar con las vistas y nos ahorran interminables ficheros de configuración.

  • Return View(): no tenemos que especificar explícitamente que vista estamos devolviendo, porque si no lo hacemos utilizará el nombre de la acción para encontrar la vista. Este ejemplo retorna la vista Create.
// GET: /Peliculas/Create
public ActionResult Create()
 {
return View();
 }
  • Estructura Vista – controlador:  Los controladores se tendrán que llamar MyNombreController y las vistas estarán en una carpeta llamada MyNombre dentro de la carpeta Views. De esta manera el controlador encontrará la vista sin problemas.

En esta imagen las extensiones de los ficheros son .cshtml porque he utilizado el motor de vista Razor en C#, si utilizara VB seria .vbhtml y si utilizara el motor de vista ASPX sería (.aspx, .ascx, .Master)

Creo que con esto hemos visto todo lo que tiene que ver con las vistas en MVC 3

4 comentarios en “Vistas & View Engines en ASP.NET MVC

  1. En realidad con MVC perdemos un nivel de abstraccion que nos permitia centrarnos en la funcionalidad, y solo usar HTTP cuando era necesario, una de las cosas que sospechaba era que hacer un combo autopostback seria complicado en MVC, y por lo que he visto si lo es, si en WebForms era solo cosa de una propiedad ahora toca hacer un engranaje adicional para ello.

    Tengo que aprender MVC, pero no porque este convencido de que sea lo mejor, sino porque el mercado lo pide… triste realidad…

  2. Marc Rubiño dijo:

    Claro, el nivel de abstracción lo puedes mirar como algo negativo porque pierdes rapidez en el desarrollo, pero en contra estas ganado mayor control en el resultado. Precisamente lo que más nos va a costar es el NO pensar en postbacks. Ahora tienes que pensar en acciones y es posible que ni siquiera necesites hacer la llamada al servidor y lo que hacías con ese control hacerlo desde el cliente o con una llamada AJAX para facilitar la usabilidad al usuario.

    Lo tendremos que tomar con calma Ernesto ;-)

  3. Hola Ernesto,

    Creo que tu punto de vista es correcto, pero tengo varias respuestas para darte ;)

    Primero es que Microsoft no ha dejado de lado las WebForms que conocíamos. Puedes echarle un vistazo a lo que va a venir con Asp.Net 4.5 (Asp.Net vNext). Ahí se va a potenciar la framework en este sentido. Así que el mercado no te va a obligar…

    Por otro lado, MVC es la respuesta de Microsoft a la petición de la comunidad: Quitar los intermediarios que no te dejan controlar las respuestas Web, y hacerlo aplicando los patrones de diseño (buenas prácticas) especificos para este tipo de plataformas.

    En mi opinión MVC es genial y es una respuesta perfecta a lo que muchos programadores le pedíamos a la gigante de Redmon. No veo un problema tener que tratar con el protocolo http, si no su mayor virtud. Pero claro, también me parece que los postback y viewStates son elementos muy poco eficientes…

    Lo bueno es que hay una solución para todos los gustos :D

Replica a Marc Rubiño Cancelar la respuesta