ASP.Net MVC, routing y URL amigables
Creo que una de las cosas que más le gusta a los webmasters son las URL amigables, por todo el tema de Google y de posicionar la página. Para los que no saben de qué estoy hablando, lo resumo fácilmente: una URL del tipo www.dominio.com/productos?id=4525 no dice mucho en sí misma sobre qué es el producto y es difícil de recordar, por eso se dice que "no es amigable", una URL amigable en cambio, sería de la forma www.dominio.com/catalogo/navegadores/gps-nuvi-200. En esta url claramente vemos que se trata de un producto dentro de la categoría "navegadores" y su descripción es "gps-nuvi-200". Además de ser lindas para los simples mortales, las URL amigables son muy buenas para los motores de búsqueda. En wikipedia hay más información (note usted la URL amigable en la mismísima wikipedia).Ahora bien, implementar URL amigables en ASP.Net nunca fue tarea fácil hasta la llegada de ASP.Net MVC. Con este nuevo framework podemos crear rutas, que no son más que formas de indicarle al motor como traducir una url en una llamada a una acción de un controlador.
Para ilustrar mejor vamos a ver un pequeño ejemplo. Supongamos que tenemos un controller llamado ProductosController, con una acción llamada Ver que tiene como objetivo mostrar un producto cuyo código único recibe como parámetro. Sin usar rutas, una url típica sería de la forma /productos/ver/4525. Vamos entonces a crear una ruta para hacerla más amigable.
En ASP.Net MVC, las rutas se registran en el evento Application_Start y se evalúan de la primera a la última, cuando una corresponde ("matchea" se podría decir, aunque no me guste hablar así) con la url, es esa la que se usa. Para nuestro caso, la ruta quedaría así:
routes.MapRoute(
"Catalogo",
"catalogo/{id}/{descripcion}",
new { controller = "Productos", action = "Ver", id = 0 },
new { id = @"\d+" }
)
El primer parámetro es el nombre de la ruta (que debe ser único", el segundo es el patrón de la url y el tercero es el que indica los valores por defecto. El cuarto parámetro lo veremos luego. En los valores por defecto le estamos diciendo que si no puede detectar el nombre del controlador en la url, que use "Productos" y que si no puede encontrar la acción, que use "Ver". Con esta ruta, al llamar a la url /catalogo/4525/gps-nuvi-200 en realidad se estará llamando al método Ver de la clase ProductosController, pasandole el valor 4525 como parámetro.
Vamos a hacer un poco más interesante la url. Supongamos que queremos dar la posibilidad de colocar la categoría del producto en la url, o sea algo de la forma /catalogo/navegadores-satelitales/4525/gps-nuvi-200. Para hacerlo, basta con agregar otra ruta más de la siguiente forma:
routes.MapRoute(
"CatalogoConCategoria",
"catalogo/{categoria}/{id}/{descripcion}",
new { controller = "Home", action = "Prueba", id = 0 },
new { id = @"\d+" }
);
En esta nueva ruta, hacemos casi lo mismo que en la anterior, con la diferencia que ahora estamos esperando urls con la categoría antes del ID de producto. Lo importante de esto es el cuarto parámetro que no expliqué hoy. Ese parámetro no es más que una restricción sobre los elementos de la URL, y le indica al motor de ruteo que la url corresponde con esa ruta si se cumple esa condición. En nuestro caso, le estamos diciendo que el ID debe ser un número. Esto es muy importante porque si no lo hacemos, al recorrer las rutas en orden, el motor tomaría la categoría como ID de producto, dando un comportamiento que no es el esperado.



1 comentarios:
Publicar un comentario en la entrada