domingo, 16 de marzo de 2008

ASP.NET MVC Framework

Ok, no descubro nada nuevo Microsoft está gestando un framework de desarrollo Web que soporta el patrón MVC (model view controller) tenía un poco de fiaca de postear sobre él y sobre todo estaba esperando que se encuentre un poco más cocinado, ya me pasó con Linq de hacer una aplicación que lleve a producción y en medio de todo eso cambió la especificación, sí, ya sé soy un kamikaze y quién no lo es un poco, de todos modos ya había utilizando año y medio atrás monorail que es casi lo mismo, ASP.NET MVC tiene un poco del estilo Microsoft en el sentido que algunas cosas son más fáciles, por ejemplo se puede utilizar toda la potencia de Linq y Linq To Sql, en fin basta de dar vueltas.

Aprovechando la generosidad de José María Aguilar para hacer un template de ASP.NET MVC para Visual Web Developer express le eché mano a esto, recomiendo que visiten el blog de José María es muy bueno. Bien, tiempo atrás estuve en Microsoft viendo una presentación acerca de este framework (hablando de cambio entre la versión que nos presentaron y la actual hay cambios, en fin) y terminé de caer en que no es muy diferente a monorail.

Vamos a dejarnos de previas y a comenzar.

Necesitamos bajar el Visual Web Developer express, el MVC framework y el template de José María

El zip lo colocamos en

Mis documentos\Visual Studio 2008\Templates\ProjectTemplates\Visual Web Developer

tal cual está sin descomprimir

Con todo esto listo abrimos el VWD (Visual Web Developer) y nos aparece la siguiente opción

Hacemos Ok, y tenemos la siguiente estructura por defecto

ok, vamos a explicar qué es esto.

Qué es MVC

Es un patró de diseño, la idea es que una aplicación se compone de tres elementos básico

Modelo: Representa el modelo de dominio, los datos, en general entidades de datos o acceso a datos depende, también la forma de manipularlos, lógica de negocios, etc.

Controller: Controlan la vista, la forma de interactuar.

View: La presentación, el render de los datos.

Bien, esto parece una simple arquitecutra en capas de lo más pedorra, sin embargo es muy estricto, por ejemplo la vista no puede hacer más que mostrar datos, nada de lógica de nada.

Entonces analicemos los archivos que se generan cuando creamos el proyecto

Las tres carpetas que nos interesan son Models, Views y Controller (aunque resulte increíble), este es un detalle importante, el framework nos obliga a separar todo en carpetas porque va a tomar decisiones de dónde ir a buscar cosas por convenciones una de éstas es la estructura de directorios.

Necesitamos sí o sí tener estos directorios sino, no funciona nada, bien, primer punto claro.

Ahora bien, vamos a ver qué nos dejó José María en la carpeta Controllers, hay un archivo llamado HomeController y aquí otra convención los controladores se llamarán siempre AlgoController, más adelante vamos a ver por qué.

Vamos al código del HomeController, al método Index

public void Index()
{
 RenderView("Index");
}

Otra convención es el nombre de los métodos públicos, éste método publico Index dentro del controllador HomeController le dice al framework que cuando desde el navegador haga

miSitio/home/index

Se va a invocar éste método, re loco no?, esto le llaman ruteo y en el caso del ASP.NET MVC se puede alterar el comportamiento pero por defecto es así.

Ahora qué es lo que se va a mostrar, vemos dentro del método Index una invocación al método RenderView los más suspicaces se darán cuenta que de esta manera llamamos a la vista, ahora, le decimos RenderView("Index") notar que no le decimos ni la ruta ni la extensión, otra convención, ya que nos encontramos en el HomeController el framework va a buscar en Views/Home/Index, otra vez nos obliga a trabajar ordenadamente, más aún, si quisieramos pasarle datos a la vista para que los renderice se los pasamos como parámetro y no mucho más, nada de ida y vuelta o de lógica en la presentación, vamos a ver el método Links

public void Links()
{
 string[] links =
                      { "http://www.variablenotfound.com",
                         "http://www.microsoft.com",
                         "http://www.asp.net",
                       };
 RenderView("Links", links);
}

como podemos ver llamamos a la vista Links de Home y le pasamos un array de string, ahora vamos a ver el código de la vista

La Vista

public partial class Views_Home_Links : ViewPage<string[]>
{
 protected void Page_Load(object sender, EventArgs e)
 {
 }
}

Antes que nada notemos que para que se una página se comporte como una vista MVC es necesario que herede de ViewPage, en caso que necesitemos pasarle datos a la vista para que los renderice se los pasamos como un tipo genérico como en éste caso ViewPage esto va a permitir que funcione el intellisense desde el lado de la vista, veámoslo.

<ul>
<% foreach (string s in ViewData)  { %>
   <li><a href="<%= s %>"><%= s %></a></li>
<% } %>
</ul>

Como vemos hay una propiedad ViewData de ViewPage que se llena cuando invocamos a la vista con RenderView("vista", viewData), le indicamos el tipo cuando hacemos

Pagina: ViewPage<tipodatos>

y listo, tenemos intellisense para ViewData del lado de asp.net.

Para manipular la forma que mostramos los datos podemos usar toda la potencia de .net, incluso se irán agregando helpers para hacer cosas como grilla según me han contado.

Bueno, hasta acá la introducción a medida una intro nada más, en medida que se vayan asentando las cosas imagino que vamos a ver más, saludos.

2 comentarios:

José M. Aguilar dijo...

Hola, Leonardo.

Muy buen post. Seguro que animará a probar el framework a más de uno.

Y gracias por la referencia!

Leonardo Micheloni dijo...

Gracia José María a vos por el aporte, saludos.