sábado, mayo 30, 2009

ASP.NET MVC Routing Validations

Ayer asistí a la reunión de la comunidad TjNet fue la presentación sobre ASP.Net MVC que dieron Mario Chavez y Fernando Castellanos. Hubo pocos asistentes sin embargo hubo varias preguntas interesantes, incluso falto tiempo para seguir con las preguntas.

Algo que se preguntó ahí en la reunión fue: ¿Como restringir el routing en ASP.NET MVC con expresiones regulares? Mencioné que si se podía pero en ese momento no me acorde como hacerlo ;), bueno pues aquí muestro un ejemplo.

Una vez creado un nuevo proyecto de asp.net mvc desde visual studio, voy a agregar dos métodos al HomeController
public ActionResult WelcomeByName(string name)
{
ViewData["Message"] = "Bienvenido, tu nombre es: " + name;
return View("Index");
}

public ActionResult WelcomeById(int id)
{
ViewData["Message"] = "Welcome, your user ID is " + id;
return View("Index");
}
mi idea es que si el usuario pone la dirección /Welcome/{cadena}
se ejecutará el metodo WelcomeByName (mensaje en español) y si el usuario escribe /Welcome/{entero} se ejecutará el metodo WelcomeById (mensaje en ingles).

Para ello debo de agregar entradas a mi tabla de rutas que se crea en el archivo Global.asax
routes.MapRoute(
"Welcome int",
"Welcome/{id}",
new { controller = "Home", action = "WelcomeById" },
new { id = @"^\d+$" }
);

routes.MapRoute(
"Welcome s",
"Welcome/{name}",
new { controller = "Home", action = "WelcomeByName", name = "anonimo" }
);
Estas dos entradas las puse antes de la entrada "Default". La primera ruta indica que espera una dirección con la forma "Welcome/{id}" para ejecutar la acción WelcomeById del HomeController, pero ademas agrega una restricción (usando expresiones regulares) que indica que solo se usara esta ruta si el parámetro "id" es entero positivo (o cero). Entonces si el valor de id no cumple con la condición no se usará esa ruta y se buscará otra para ser utilizada.

La segunda ruta es similar a la primera solo que no tiene restricción alguna, por lo tanto si es entero el valor se ejecuta la primera, para las demás (que inicien con "Welcome") se ejecuta la segunda.

Corro la aplicación y escribo la dirección en el navegador y compruebo que las rutas funcionen















Pueden encontrar mas información sobre esto en la grabación de la VAN de Alt.Net Hispano. Sobre ASP.NET MVC Avanzado explicada por Hadi Hariri.