Esta mañana hemos publicado la Preview 3 de ASP.NET MVC Framework. Ya hablé el mes pasado sobre una versión interna que incluía muchos de los cambios que iban a aparecer en esta Preview 3. La versión de hoy incluye algunas nuevas características que no se incluyeron en aquella versión interna, algunas mejoras, refinamientos, así como una herramienta para Visual Studio de integración y de documentación.
Podéis descargar un paquete de instalación aquí. También podéis descargaros el código fuente y los test unitarios aquí.
Cambios en el métodos de acción
ASP.NET MVC incluye los cambios que hablábamos en los controladores de la versión de Abril, con algunas cositas más, ;-).
Podemos seguir escribiendo métodos de acción de las controladoras que devuelvan void y encapsular toda su lógica en métodos de acción. Por ejemplo:
que se renderizará así:
Esta Preview 3 nos permite devolver objetos “ActionResult” con el resultado del método de acción, y nos permite una ejecución diferida. Con ello conseguimos una forma más sencilla de hacer test unitarios de las acciones (sin tener que recurrir a objetos mock). También conseguimos una composición más clara y un flujo de ejecución más claro.
Por ejemplo, podemos usar LINQ to SQL en el método de acción Browse para obtener una secuencia de productos desde la base de datos e indicarle que queremos renderizar una vista con ellos. El código siguiente hace que se pasen tres “ViewData” a la vista – “title” y “CategoryName” como strings, y una secuencia fuertemente tipada de productos (como objeto ViewData.Model):
Una de las mayores ventajas de lo anterior es que hace que la creación de test unitarios de las acciones de los controladores sea realmente fácil (sin objetos mock). Aquí tenéis un test unitario que comprueba el comportamiento del método de acción Browse:
Podemos crear una ViewPage “Browse” en el subdirectorio ViewsProducts para renderizar una respuesta que use los datos del método de acción:
Cuando nos vamos a la url /Products/Browse/Beverages obtendremos la siguiente respuesta html (en rojo tenéis marcados los ViewData):
Además de añadir soporte para respuestas “ViewResult” (para indicar que debe renderizarse una vista), ASP.NET MVC Preview 3 también soporta la devolución de “JsonResult” (para escenarios de serialización para AJAX), “ContentResult” (para streaming de contenidos sin una vista), y resultados HttpRedirect y RedirectToAction/Route.
Todas las soluciones de ActionResult son extensibles (permitiéndonos crear nuestros propios tipos de respuesta), y con el tiempo veréis que vamos añadiendo más y más tipos de resultados.
Helper HTML Methods mejorados
Los métodos Html Helper se han actualizado en esta Preview 3. Además de corregir algunos bugs, han incluido varias mejoras en la usabilidad:
- Búsqueda automática de valores
En las versiones previas teníamos que pasar explícitamente el valor necesario para renderizar la vista cuando llamábamos a un Html helper. Por ejemplo: para incluir un valor en <input type=”text” value=”some value”/> teníamos que escribir:
El código anterior sigue funcionando, aunque ahora podemos escribir:
Los Html Helpers por defecto comprobarán en el diccionario ViewData y en cualquier objeto de modelo que le pasemos y buscará el índice o propiedad que se llame ProductName.
Modelos de vista SelectList y MultiSelectList
Las clases SelectList y MultiSelectList nos van a permitir una forma más clara de trabajar con listas desplegables y listboxes multiselección (cosas como seclección actual, etc). Un ejemplo muy claro de esto es cuando instanciemos y configuremos estos modelos en una acción de controlador, y se lospassemos en el diccionario ViewData a la vista.
Por ejemplo, en este código estamos creando una SelectList sobre el conjunto de categorías de nuestra base de datos. Le estamos diciendo que queremos usar la propiedad “CategoryID” como el valor para cada elemento de la lista, y que el “CategoryName” como el texto a mostrar. También le estamos asignando el CategoryId del producto que estamos editando:
En la vista sólo tenemos que escribir el siguiente código para indicar que queremos crear una lista desplegable con la SelectList que hemos puesto en el ViewData:
Esto se renderizará de la siguiente manera:
Aún no hay validación de errores en los HTML helpers (tendremos que escribir código para ello) – pero dentro de poco estará disponible, lo que hará más sencillo aún los escenarios de edición.
Empezaremos a ver ASP.NET AJAX helper methods en futuras versiones también, con lo que conseguiremos integrar AJAX en aplicaciones MVC con un mínimo de código.
Mejoras en el rutado URL
Se han introducido varias mejoras en el sistema de rutado de urls. El rutado url es uno de los componentes fundamentales de un framework web MVC, esta es la razón por la que nos hemos esforzado tanto en este area. El nuevo motor de rutado URL saldrá con el .NET 3.5 SP1 este verano, y soportará tanto Web Forms como peticiones MVC. ASP.NET MVC podrá usar el motor de .NET 3.5 SP1 cuando se ejecute en él. También incluirá su propia copia del ensamblado para que funcione sin el SP1.
Agunas de las mejoras del motor URL en esta preview 3 son:
Helper methods MapRoute() y IgnoreRoute()
Con estos métodos podremos registrar de una forma más sencilla reglas de rutado. MapRoute() nos permite una forma sencilla de añadir nuevas reglas MVC Route a la colección de rutas. IgnoreRoute() nos permite eliminar patrones de URL de esa misma coleccion (por ejemplo: administrar recursos .axd en ASP.NET que se usan para servir JavaScript, imagenes, etc).
Aqui tenéis un ejemplo del método por defecto RegisterRoutes() con Global.asax cuando creamos un nuevo proyecto MVC en el que podéis ver estos dos helper methods en acción:
El método MapRoute tiene varias sobrecargas y admite dos, tres o cuatro parámetros (nombre de la ruta, sintaxis URL, parametros URL por defecto, y una expresión regular para urls).
Podemos llamar a MapRoute() tantas veces como queramos para registrar las rutas que queramos en el sistema. Por ejemplo, además de la regla por defecto, podemos añadir la ruta “Products-Browse” de la siguiente manera:
Ahora podemos hacer referencia a esta ruta explícitamente en nuestras clases controladoras y en las vista cuando queramos generar una url para ella. Por ejemplo, podemos usar el view helper HTML.RouteLink para indicar que queremos enlazar a nuestra ruta “Products-Browse” y pasarle la categoría “Food”:
Este view helper accederá al sistema de rutado y devolverá el link HTML necesario para la url como vemos en la siguiente imagen:
Nuevas características en el mapeo de rutas URL
En esta preview se incluyen un montón de nuevas características para el mapeo de rutas. Ahora podemos incluir “-“, “.”, “;” en cualquier caracter que queramos pasar como parte de nuestras rutas.
Por ejemplo, usando el serparador “-” podemos parsear el lenguaje y valores de localización de nuestras urls con la siguiente regla:
Esto le pasará los parámetros apropiados “language”, “locale” y “category” al método de acción ProductsController.Browse cuando se invoque:
URL Route Rule | Example URL | Parameters Passed to Action method |
{language}-{locale}/products/browse/{category} | /en-us/products/browse/food | language=en, locale=us, category=food |
/en-uk/products/browse/food | language=en, locale=uk, category=food |
O podemos usar el “.” de extensión de archivos al final de la url para determinar si renderizar el resultado en formato XML o HTML:
Esto le pasará el “category” y el “format” al metodo ProductsController.Browse:
URL Route Rule | Example URL | Parameters Passed to Action method |
products/browse/{category}.{format} | /products/browse/food.xml | category=food, format=xml |
/products/browse/food.html | category=food, format=html |
ASP.NET MVC Preview 3 también soporta rutas wlidcard (esto también estaba en la Preview 2). Por ejemplo, podemos indicar una regla para que pase todo el contenido URI como un parámetro con nombre a un método de acción:
Esto le pasará el parámetro “contentUrl” al método de acción WikiController.DisplayPage:
URL Route Rule | Example URL | Parameters Passed to Action method |
Wiki/Pages/{*contentUrl} | /Wiki/Pages/People/Scott | contentUrl=”People/Scott” |
/Wiki/Pages/Countries/UK | contentUrl=”Countries/UK” |
Estas rutas son muy útiles si estamos creando un sistema de blogs, un wiki o un cms, o cualquier sistema de gestión de contenidos.
Resumen
La preview 3 de ASP.NET MVC incluye un montón de nuevas mejoras. Estamos empezando a ver todo lo que nos ofrece el rutado url y el modelo de programación Controller/Action del modelo MVC, y vemos que funcionan bastante bien. En próximas versiones empezaremos a ver más mejoras que van a impulsar la el desarrollo de otras areas como las Vistas (html helpers, validation helpers, etc), AJAX, sub-controllers y composición de sitios, login profundo, Authentication, Authorization e integración de Cache.
También tengo un (muy) largo tutorial que he empezado este fin de semana sobre cómo crear un sitio paso a paso con ASP.NET MVC Preview 3 que espero postear en los próximos días. Creo que será un tutorial muy interesante para el que quiera empezar con ASP.NET MVC.
Espero que sirva.
Scott
Traducido por: Juan María Laó Ramos.
2 thoughts on “ASP.NET MVC Preview 3”