Publicada ASP.NET MVC V2 Preview 1

El equipo de ASP.NET acaba de publicar la primera preview de ASP.NET MVC Versión 2. Podéis descargarla aquí.

Esta preview funciona en .NET 3.5 SP1 y VS 2008, y la podemos instalar en la misma máquina que tenga ASP.NET MVC 1.0 (es decir, no abrá conflictos entre proyectos que se hayan creado con ASP.NET MVC 1.0). Si tenemos las dos versiones instaladas tendremos dos plantillas de proyecto para ASP.NET MVC en el cuadro de diálogo de Visual Studio:

Las notas que vienen junto a la release detallan cómo actualizar los proyectos creados con ASP.NET MVC 1.0 si quieremos migrarlos y aprovechar las nuevas características.

Nuevas características.

ASP.NET MVC V2 incluye un montón de nuevas capacidades y características (algunas de ellas se han nombrado en la página de roadmap de ASP.NET MCV). esta preview 1 contiene alguna de las nuevas características. Se irán añadiendo más características en futuras builds. Los bits de esta Preview 1 son realmente tempranos – el equipo está ha hecho esta release para poder empezar a recivir feedback.

Aquí tenéis algunos detalles de las nuevas capacidades de la nueva Preview 1.

Soporte de Areas

ASP.NET MVC 2 incluye el soporte para una nueva característica llamada «areas» que nos premiten particionar y agrupar funcionalidad por toda la aplicación MVC.

Areas nos permite agrupar controladores y vistas para poder crear subsecciones en una aplicación ámplica y aislarla de otras secciones. Cada area puede ser implementada como un proyecto ASP.NET MVC diferente y ser referenciados desde la aplicación principal. Con esto conseguimos mejorar la complejidad de crear una aplicación grande y nos facilita poder tener varios equipo trabajando juntos en una misma aplicación.

Aquí tenéis una captura de pantalla que muestra una solución que tiene tres proyectos. Uno de los proyectos se llama «CompanySite» que incluye el contenido principal del sitio, layout y controladores y vistas. A parte tenemos dos proyectos «Area» – «Blogs» y «Foros». Estos proyectos implementan la funcionalidad que existe bajo las urls /Blogs y /Forums del sitio – y encapsula todas las reglas de rutado, controladores y vistas que implemnetan estas secciones.

Esta preview 1 incluye la primera parte de la característica de «areas». Aún no incluye ninguna herramienta que nos ayude (por ahora tendremos que hacerlo manualmente y añadiendo una tarea de build para crear un proyecto area y montarlo). Futuras previews incluyeran herramientas y refinamientos de esta característica.

Soporte de validaciones con DataAnnotation

ASP.NET MVC 2  incluye soporte para validaciones con anotaciones que se publicó con .NET 3.5 SP1 – y que es usado en ASP.NET Dynamic Data y en .NET RIA Services. las DataAnnotations nos permiten una forma sencilla de declarar y añadir reglas de validaciones a las clases de Modelo y de ViewModel de una aplicación, y tener bindings automáticos validaciones de UI en ASP.NET MVC.

Para ver esta característica en acción podemos crear una clase «Customer» para el ViewModel como la siguiente con cinco propiedades (implementandola usando la característica de C# de propiedades automáticas.

Podemos decorar las propiedades con reglas de validación adecuadas usando los atributos de DataAnnotation que están implementados el namespace en System.ComponentModel.DataAnnotations. El código siguiente usa 4 reglas diferentes – [Required],[StringLength], [Range], y [RegularExpression]. El namespace también incluye una clase base (ValidationAttribute) que podémos heredar para crear nuestros propios atributos de validación.

Ahora podemos crear la clase CustomersController que tenga dos métodos acción Create. El primero se encarga de las peticiones HTTP GET a la url «/Customers/Create», y renderiza una vista basada en un objeto Customer vacío. El segudno método de acción se encargará de las peticiones HTTP POST a la misma URL (que se le pasa como parámetro un objeto Customer). Comprueba si hay algún error de los datos, y si hay alguno actualiza la vista usando los datos que ya se les ha pasado. Si no hay errores muestra una vista de éxito al usuario:

Finalmente, podemos hacer clic derecho en cualqueira de los dos métodos Create, elegimos «Add View» y automáticamente se monta todo lo necesario para la vista que se vasa en el objeto Customer. Cuando hacemos esto, la vista creada contendrá el siguiente HTML:

Y ahora cuando hagamos una petición a la url «/Customer/Create» en nuestro navegador y obtendremos el siguiente resultado:

Si introducimos datos incorrectos en este formulario y hacemos un post al servidor, el binder de ASP.NET MVC2 detectará que hay atributos de Data Annotations en la clase Customer, y automáticamente validará los datos. Si hay errores, el método controlador actualizará el formulario – mostrándonos los mensajes apropiados que mostrar al usuario. Fijáos cómo en la propiedad de validación hemos indicado que ménsajes se van a usar. Sin ningún código más que haga eso:

El formulario anterior se actualizará con los mensajes de error correspondientes cada vez que el usuario introduzca datos inválidos.

En una preview próxima de ASP.NET MVC 2 palenamos incorporar el plugin de validaciones de jQuery como parte de la plantilla por defecto, y añadiremos soporte para el código javascript cliente con validaciones DataAnnotation también. Esto permitirá a los desarrolladores añadir reglas de validación muy fácilmente tanto en el modelo como en las vistas, y tenerlas tanto en cliente como en el servidor y en cualquier lugar que se use dentro de la aplicación.

Si no queremos anotar nuestras clases de modelo o de vistas directamente, podemos crear una clase «buddy» que acompañe a nuestra clase de modelo y encapsule las reglas de DataAnnotation de forma separada. Esta capacidad es muy útil en escenarios done Visual Studio está generando/actualizando las propiedades de una clase directamente y no podamos añadir fácilmente estos atributos (por ejemplo: clases generadas por los diseñadores de Linq to SQL o Linq to Entites).

Además soportar las DataAnnotations, la clase DefaultModelBinder de ASP.NET MVC V2 ahora tiene nuevos métodos virtuales que podemos sobreescribir para integrar otros frameworks de validación (por ejemplo: Castle Validator, Entlib Validation,etc ). Los métodos de ayuda para validaciones en UI de ASP.NET MVC están diseñados para soportar cualquier framework de validaciones (de hecho no saben nada de DataAnnotations).

Ayudantes UI fuertemente tipados

ASP.NET MVC V2 incluye nuevos ayudantes HTML de UI que nos permiten usar expresiones lambda fuertemente tipadas cuando referenciamos el objeto de modelo de una vista. Esto nos permite tener comprobación de sintaxis en tiempo de compilación en nuestras vistas ( de forma que muchos errores podemos encontrarlos en tiempo de compilación en lugar de en ejecución), y además nos permite un soporte mucho mejor de intelisense en las vistas.

Podemos ver un ejemplo de este intellisense en acción – fijáos cómo estamos obteniendo un listado completo del modelo de customer con sus propiedades cuando usamos el método de ayuda Html.Editorfor():

La Preview 1 ya tenía los métodos Html.TextBoxFor(), Html.TextAreaFor(), Html.DropDownListFor(), Html.HiddenFor(), y Html.ValidationMessageFor() (con el tiempo se han movido al nucleo de ASP.NET MVC 2).

Aquí tenéis una versión actualizada de la vista «create» del escenario que estamos manejando. Fijáos que en lugar de usar strings para referenciar a nuestro objeto customer estamos usando expresiones lambda fuertemente tipadas en los métodos UI. Tenemos intelisense en tiempo de compilación y comprobación de sintáxis en todos ellos:

El método Html.LabelFor() anterior genera el html <label for=»Name»> Name:</label>.

El método Html.EditorFor() puede ser usado para cualquier tipo de valor. Por defecto es inteligente y generará el elemento HTML </input> necesario basandose en el tipo que se va a editar. Por ejemplo, generará <input type=»text»/> para las primeras cuatro propiedades (que son strings y enteros). Generará un <input type=»checkbox»/> para la propiedad «IsActive» – que es de tipo booleano.

Pero además de soportar tipos simples de datos, el método Html.EditorFor() también nos permite pasar tipos complejos con muchas propiedades. Por defecto iterará por todas las propiedades del objeto y generará elementos <label>, <input/>, y todos los mensajes de validación necesarios para cada propiedad que encuentre. Por ejemplo, podríamos reescribir la vista anterior para que tenga una única llamada a Html.Editorfor() del objeto Customer para que genere el mismo HTML que ántes:

Los métodos fuertemente tipados nos permiten decorar las propiedades de la clase Customer del ViewModel con los atributos [DisplayName] para controlar el string de la etiqueta que se mostrará para cada propiedad (por ejemplo. en lugar de tener un label con el texto «IsActive» podríamos aplicar el atributo [DisplayName(«Is Active Customer»)]).

Podríamos añadir los atributos [ScaffoldColumn(false)] para indicar que una propiedad particular no debería renderizarse en escenarios como el anterior en el que se pasan tipos complejos al método Html.EditorFor().

Soporte de plantillas en helper methods de UI

Los métodos Html.EditorFor() y Html.DisplayFor() soportan el renderizado de tipos de datos estándar y complejos con múltiples propiedades. Como hemos visto ántes, también permiten una personalización básica en los renderizados aplicando atributos como [DisplayName] y [ScaffoldColumn] en el ViewModel.

Los desarrolladores normalmente quieren ser capaces de personalizar la salida de los helpers de UI hasta tener contorl total sobre lo que se genera. Los métodos Html.EditorFor() y Html.DisplayFor() soportan esto a través de un mecanismo de plantillas que nos permiten definir plantillas externas que se pueden sobreescribir y tener control completo sobre lo que se renderiza. Mejor aún, podemos personalizar el contenido del renderizado por clase.

En la preview 1 podemos añadir los directorios «EditorTemplates» y/o «DisplayTemplates» bajo el directorio views[NombreDecontorladora] (si queremos personalizar el renderizado de las vistas que use una controladora concreta) o bajo el directorio ViewsShared (si queremos perosnalizar todas las vistas de todas las controladoras de la aplicación).

Podemos entonces añadir archivos parciales de plantillas en esos directorios para personalizar la salida del renderizado que se hace por cada tipo concreto. Por ejemplo, aquí hemos añadido el directorio EditorTemplates bajo el directorioViewsShared – y hemos añadidos tres archivos:

La plantilla «Customer.ascx» indica que queremos personalizar la salida cada vez que al método Html.EditorFor() se le pase un objeto de la clase Customer (por ejemplo: Podría personalizar el orden de las propiedades ). La plantilla «DateTime.ascx» indica que queremos personalizar la salida cada vez que se le pase un objeto de tipo DateTime al método Html.EditorFor() (por ejemplo: Querría poder usar el datepicker de JavaScript en lugar de un textbox). Opcinalmente añadiríamos una plantilla «Object.ascx» si quiero sobreescribir el comportamiento de renderizado de todos los objetos.

Además de personalizar el renderizado de cada tipo, podemos añadir «plantillas nombradas» al directorio. Un escenario común podría ser un «CountryDropDown» que administre un tipo string – pero en lugar de poner un textbox, renderiza una lista <select> con todos los países que un usuario puede seleccionar. Aquí tenéis cómo sería la plantilla:

Podemos indicar explícitamente que queremos que use la plantilla anterior pasándole el nombre como argumento cuando llamemos a Html.EditorFor(). Por ejemplo, en el siguiente código le especificamos una expresión lambda para la propiedad Country, y también el nombre de la plantilla que queremos que use para la renderización:

Alternativamente, podemos especificar atributos «UIHint» en las propiedades del ViewModel. Esto nos permite indicar el editor por defecto o la plantilla que se usará en un lugar específico, y será usado en todas las vistas de la aplicación (sin tener que pasar explícitamente como argumento al método Html.EditorFor).

Aquí tenéis un ejemplo de cómo indicar con un atributo UIHint en la propiedad Customer.Country (que es de tipo string) que debería usarse la plantilla CountryDropDown cuando se renderize:

Una vez que le ponemos el atributo en el ViewModel ya no tendremos que indicar más el nombre de la plantilla que queremos usar en el Html.EditorFor(). Y ahora si le damos a refrescar a la url /Customers/Create, la propiedad country se renderizará como una lista deplegable en lugar de un textbox estándar:

Otras características chulas.

ASP.NET MVC V2 Preview 1 incluye otras pequeñas características pero realmente impresionantes. Algunas de mis favoritas son:

Nuevo atributo [HttpPost]

Es muy común en ASP.NET MVC usar la misma url pero dos métodos de acción diferentes – uno que se encarge de las peticiones GET y otro para las peticiones POST.

Con ASP.NET MVC1 usábamos el atributo [AcceptVerbs(HttpVerbs.Post)] para indicar una versión «Post» del método de acción:

Esto sigue funcionado en ASP.NET MVC2. Pero además, podríamos hacerlo usando el atributo [HttpPost] que hace exáctamente lo mismo:

Parámetros por defecto

Administrar parámetros opcionales es algo muy común en escenarios web. Con ASP.NET MVC1 podíamos administrar parámetros opcionales registrando una ruta personalizada y especificando un valor por defecto, o marcando un parámetro del método de acción con DefaultValueAttribut del namespace System.ComponentModel. Esto nos permite especificar el valor de un parámetro que ASP.NET MVC debe pasar si no está presente como parte de la petición. Por ejemplo, aquí tenéis un ejemplo de cómo podemos jugar con las urls /Products/Browse/Beverages y /Products/Browse/Beverages?page=2 – y tener el parámetro «page» como 1 cuando no se especifica en el querystring:

Visual Basic nos permite especificar valores por defecto en los parámetros (evitando tener que usar el atributo DefaultValue). C# en VS2010 también soportará valores por defecto en parámetros opcionales – que nos permitirá escribir código tan simple como este:

Esto hara que los escenarios de valores por defecto y opcionales sea mucho más fácil y limpio.

Enlazando Datos Binarios.

ASP.NET MVC Preview 1 soporta el enlace(binding) de valores en base64 a propiedades de tipo byte[] y System.data.Linq.binary. Ahora hay dos versiones sobrecargadas de Html.Hidden() a los que podemos pasar estos tipos de datos. Esto puede ser muy ´tuil en escenarios en los que queramos habilitar control de concurrencia en nuestra aplicación y queremos pasar valores timestamp de columnas de la base de datos en nuestros forumlarios.

Resumen

Aquí podéis descargar un archivo .zip que contiene el proyecto ASP.NET MVC 2 que implementa el código de ejemplo que he mostrado en este post.

En la build de hoy de ASP.NET MVC2 es tan sólo una primera preview. Se van a ir añadiendo nuevas características en futuras previews, y el equipo espera tener mucho feedback para poder mejorar y ampliar la release.

La meta de estas previews tan regulares es asegurarnos de que este proceso de feedback está abierto y que cualquiera que quiera participar puede hacerlo de manera muy fácil. Por favor postead cualquier feedback, sugerencias o problemas que tengáis en los foros de ASP.NET MVC de www.asp.net. Podéis aprender más de esta release en el post de Phil Haack de MVC2, y del video de Channel9 que hizo Phil con Scott Hanselman sobre esta Preview 1.

Espero que sirva.

Scott

P.D.: he estado usando Twitter más reciente mente para hacer post rápidos y compartir enlaces. Podéis seguirme en Twitter en http://www.twitter.com/scottgu (@scottgu es nombre en twitter).

Traducido por: Juan María laó Ramos.

Post Original.

0 comentarios sobre “Publicada ASP.NET MVC V2 Preview 1”

  1. Hola que tal.

    Actualmente estoy trabajando con esta tecnologia, y estoy necesitando crear un user control, y tengo varias dudas, principalmente, no se donde colocar el codigo digamos… c# o code behind se que no existe en este concepto pero no se como explicarlo, igual quisira solicitarte el codigo de ejemplo de un sencillo control crees que me lo puedas facilitar…

    Gracias…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *