MVC: Rutas

En este artículo vamos a aprender a utilizar las rutas en proyectos MVC creados con Visual Studio para así poder personalizar las url´s de acceso a nuestra aplicación y que sean más «amigables» para los usuarios y buscadores.

Primero creamos un proyecto Web con Visual Studio basado en la plantilla MVC,

Veremos que por defecto ya hace enrutamiento y sin tener que cambiar nada nos ofrece una url amigable.

Esta url tiene una serie de segmentos o rutas que permiten el acceso a la aplicación, de forma que se puede acceder de diferentes maneras (En este caso la vista está configurada como la de por defecto para la zona de Home).

URL Destino
Home/Index Controller=Home,Action=Index
Home/Index/3 Controller=Home,Action=Index,Id=3
Home Controller=Home,Action=Index

El enrutamiento por defecto es el siguiente: {controller}/{action}/{id}. Lo podemos ver y modificar desde el archivo RouteConfig.cs localizado en la carpeta App_Start dentro de nuestro proyecto de Visual Studio.

Con routes.MapRoute indicamos un nombre a cada ruta, una url con el patrón de enrutamiento y el controlador y vista que se llamarán.

Con routes.IgonoreRoute indicamos al enrutamiento que se ignore cualquier url que termine por axd y que tenga parámetros adicionales. {* Pathinfo} es un comodín para todos los parámetros.

Además de la ruta por defecto podemos añadir encima nuestras rutas personalizadas:

De esta forma al navegar a http://localhost:[port]/Home/AboutMe se carga la vista About de nuestra plantilla.

Se puede modificar el enrutamiento en MVC a nuestro gusto ya que los enlaces que creemos en las vistas de nuestra aplicación se montarán dinamicamente con el enrutamiento adecuado gracias al lenguaje Razor:

Como podemos imaginar vamos a tener una gran flexibilidad para hacer url´s lo más «amigables» posibles. En la siguiente tabla se pueden ver ejemplos de patrones de enrutamiento válidos:

Route definition Example of matching URL
{controller}/{action}/{id} /Products/show/beverages
{table}/Details.aspx /Products/Details.aspx
blog/{action}/{entry} /blog/show/123
{reporttype}/{year}/{month}/{day} /sales/2008/1/5
{locale}/{action} /US/show
{language}-{country}/{action} /en-US/show

+Info: https://msdn.microsoft.com/en-us/library/cc668201(v=vs.100).aspx

Pero aún hay más… Podemos configurar los enrutamientos fácilmende directamente desde los métodos de los controladores. Para ello en el archivo RouteConfig.cs agregamos la siguiente línea:

routes.MapMvcAttributeRoutes();

Y seguidamente abrimos nuestra clase del controlador y agregamos la ruta a nuestro método mediante el decorador [Route()]

Resultado:

Si tenemos parámetros. Podemos usar muchos modificadores dentro de este decorador para validar los parámetros.

Por ejemplo: [Route(“Noticias/Internacional/{id:int}”)]  //Para indicar que el id sea numérico de forma que sólo entra en el métedo si la url es algo así:

http://localhost:puerto/Noticias/Internacional/5

Route Constrain Used For Example
Alphabate It matches uppercase or lowercase Latin alphabet characters (a-z and A-Z) values. {ParameterName:alpha}
DateTime It matches a Date Time value. {ParameterName:datetime}
Decimal It matches a decimal value. {ParameterName:decimal}
Float It matches a 32-bit floating-point value. {ParameterName:float}
Integer It matches a 32-bit integer value. {ParameterName:int}
Long It matches a 64-bit integer value. {ParameterName:long}
Double It matches a 64-bit floating-point value. {ParameterName:double}
Max It matches an integer with a maximum value. {ParameterName:max(100)}
Min It matches an integer with a minimum value. {ParameterName:min(5)}
Length It matches a string with the specified length or within a specified range of lengths. {ParameterName:length(20)} {ParameterName:length(3,20)}
MaxLength It matches an string with a maxmum value. {ParameterName:maxlength(15)}
MinLength It matches a string with a minimum length. {ParameterName:minlength(6)}
Boolean It matches a boolean value {ParameterName:bool}
Range It matches an integer within a range of values. {ParameterName:range(1,500)}
Regex It matches a regular expression. {ParameterName:(^[a-zA-Z0-9_]*$)} {ParameterName:(^\d{3}-\d{5}-$)}
GUID It matches a GUID value. {ParameterName:guid}

De esta forma es posible crear enrutadores distintos para cada uno de los métodos que tengamos en nuestro controlador:

Observar que en el método de About hemos puesto [Route(«Noticias/Deportes/{id?}»)] la «?» sirve para que el parámetro id sea opcional, por lo que es válido llamarlo con o sin parámetro:

  • http://localhost:puerto/Noticias/Deportes
  • http://localhost:puerto/Noticias/Deportes/3

Mediante el decorador RoutePrefix podemos unificar rutas dentro de nuestro controlador (el resultado será el mismo que en el caso anterior):

Si es necesario se puede sobreescribir el prefijo de la clase por otro dentro del método con el símbolo «~».

En este caso la ruta de acceso sería: http://localhost:[puerto]/OtrasNoticias/Internacionales

En el siguiente ejemplo establecemos en la clase del controlador el método por defecto. Como vemos es el correspondiente a la vista Contact:

Finalmente indicar que es posible dar un nombre a los enrutamientos que creemos para después construir más facilmente los links mediante Razor.


Usando el nombre del enrutamiento el enlace se podría construir así:

<a href=»@Url.RouteUrl(«AboutMe»)»>Sobre mí</a>

En resumen, hemos visto que el enrutamiento se puede hacer directamente en la clase RouteConfig.cs o en los métodos y clases de los controladores. El primer caso permite tener todos los enrutamientos en el mismo punto (RouteConfig.cs) mientras que realizar el enrutamiento en los controladores permite saber de primera mano a que método va a llamar al cargar la ruta indicada. También es posible combinar ambos métodos de enrutamiento sin ningún problema.

Deja un comentario