This article has been localized into Spanish by the community.
Plantillas de ruteo
Hasta ahora, las rutas que hemos usado han sido muy básicas - una ruta estática, algunas veces combinadas con un simple, parámetro variable. Sin embargo, el sistema de ruteo en ASP.NET MVC tiene MUCHO más que ofrecer junto puedes de hecho crear URL de rutas más avanzadas, usando plantillas de rutas. Veremos más de las posibilidades en este artículo.
En artículos previos, usamos la sintaxis {id} para mapear una parte de la URL al parámetro llamado "id" en el método del controlador receptor. Esta es una de las plantillas de ruteo más básicas que puedes usar, pero no estás limitado a usar una variable o parámetro en tus Rutas. De hecho, puedes usar tantas como quieras y eres libre de combinarlas de cualquier forma que se te acomode. Esto podría por ejemplo ser usado para crear una URL con ID y un slug, cómo puedes ver de muchos sistemas de blogs como Wordpress etc.
Aquí hay un ejemplo de plantillas de ruta donde combinamos dos parámetros para que crear la URL clásica: [ID]/[URL_SLUG] :
[Route("blog/{entryId}/{slug}")]
public IActionResult Blog(int entryId, string slug)
{
return Content($"Blog entry with ID #{entryId} requested (URL Slug: {slug})");
}
Ahora puedes llegar a esta acción usando una URL como está:
/blog/153/testing-asp-mvc-routes/
"153" será mapeado al parámetro entryId, mientras "testing-asp-mvc-routes" será mapeado al parámetro slug y basado en eso, la siguiente salida será generada por nuestro método de acción:
Blog entry with ID #153 requested (URL Slug: testing-asp-mvc-routes)
Parámetros Atrapa-todo (Catch-all)
Si probaste la ruta de arriba, notarás que tu slug no puede contener barras diagonales (/), como está:
/blog/153/testing-the/routing-system/
La razón es probablemente obvia: La barra diagonal es normalmente usada en las puertas para separar los nombres de carpetas, e incluso aún y cuando tu Ruta No necesariamente esté relacionada a una carpeta en específico, la barra diagonal aún tiene un significado especial junto en este caso, parecería que estás intentando llegar a dos carpetas o dos parámetros con los valores "testing-the" y "routing-system". Esto puede no ser lo que quieres - quizás en tu sistema, hace sentido permitir barras diagonales como parte del slug en la url. Para situaciones como ésta ASP.NET MVC incluye el llamado catch-all parameters o parámetros atrapa todo.
Un parámetro catch-all es creado predicando el nombre del parámetro con un carácter asterisco(*), como esto:
[Route("blog/{entryId}/{*slug}")]
public IActionResult Blog(int entryId, string slug)
{
return Content($"Blog entry with ID #{entryId} requested (URL Slug: {slug})");
}
Nuestra URL de antes ahora puede permitir la barra diagonal en el parámetro slug :
URL:
/blog/153/testing-the/routing-system/
Output:
Blog entry with ID #153 requested (URL Slug: testing-asp/mvc-routes)
Parámetros opcionales
En los ejemplos de arriba, tanto el parámetro entryId como el parámetro slug eran requeridos - si se omiten en la URL, la plantilla de la ruta simplemente no se relacionara con la url solicitada y el resultado será un "404 página no encontrada" o será atrapado por una ruta por defecto. Sin embargo, algunas veces quieres hacer uno o varios parámetros opcionales, significando que pueden ser omitidos sin que la ruta falle al relacionar la url solicitada.
Por ejemplo, puedes decidir que el slug URL para tus post del Blog sea opcional - después de todo, el ID es suficiente para identificar el post del Blog deseado y mostrarlo al usuario, mientras la parte del slug es aveces incluidas por razones de lectura o SEO. Haciendo el slug parte de la URL opcional es tan simple como agregar un signo de interrogación (?) al nombre del parámetro :
[Route("blog/{entryId}/{slug?}")]
public IActionResult Blog(int entryId, string slug)
{
return Content($"Blog entry with ID #{entryId} requested (URL Slug: {slug})");
}
Ahora puedes llamar al método de acción con una URL como está:
/blog/153/
Si tú lo haces, el parámetro slug será NULL. Esto no es un problema cuando lo usas como salida en la forma en la que lo hacemos, pero si intentas usar el valor para otros propósitos, podría resultar en una NullReferenceException. Para remediar esto, deberías ya sea chequear si es NULL antes de usarlo, o, si tiene más sentido en tu caso, agregar un valor string por defecto al parámetro (vacío o no vacío) como esto:
[Route("blog/{entryId}/{slug?}")]
public IActionResult Blog(int entryId, string slug = "")
{
....
Nombres de ruteo reservados
Cuando creas tus rutas y les especificas, por ejemplo, nombres de parámetros, deberías prestar atención a las siguientes palabras, las cuales están reservadas dentro del sistema de ruteo y por lo tanto no deberían ser usadas como nombres nombres de parámetros:
- action
- area
- controller
- handler
- page
Resumen
Cómo puedes ver, el ruteo por URL es muy flexible cuando se usa la funcionalidad de plantillas como se ilustró en este artículo. Sin embargo, a veces una ruta puede volverse DEMASIADO flexible, significando que puede causar conflictos con otras rutas en tu sitio web. Para estas situaciones, así como otras, necesitas tener más control de tus rutas - esto puede ser logrado con restricciones de ruteo, las cuales discutiremos en el siguiente artículo.