This article has been localized into Spanish by the community.
Atributo de ruteo
En el artículo previo, discutimos qué es una ruta, cómo trabaja y cómo puedes definir rutas en los archivos Startup.cs. Así es como las rutas están definidas en un montón de proyectos, pero hay una alternativa: ASP.NET MVC te permite definir una ruta directamente en el controlador responsable y/o específicamente para el método o acción responsable. Esto es frecuentemente llamado Enrutamiento de Atributo. Permíteme ilustrarlo con un ejemplo:
[Route("/products")]
public class ProductController : Controller
{
public IActionResult Index()
{
return Content("Products Index");
}
}
Presta atención a la primera línea del ejemplo, donde uso el atributo método Route() para definir una plantilla de ruteo para este controlador. Notaras que mi controlador usa la palabra "product" en forma singular, pero quisiera usar la forma plural para las URLs . Puedo lograr eso definiendo esta palabra como una plantilla de ruteo para el controlador - con eso en su lugar, ahora puedo accesar a las URLs como /products/ o /products, ya que ellas apuntarán por defecto a nuestro método Index.
Eso fue muy básico y solamente trabaja porque automáticamente recae en el método index, pero el enrutamiento de atributos te permite casos de uso mucho más complicados también. Por ejemplo, el controlador puede también ser usado para servir un sólo producto en vez de una vista general. Agreguemos un método para eso, y definamos una ruta de acceso para esto al mismo tiempo
[Route("/products")]
public class ProductController : Controller
{
public IActionResult Index()
{
return Content("Products Index");
}
[Route("{id}")]
public IActionResult Details(int id)
{
return Content("Product #" + id);
}
}
Nota como he agregado un atributo de ruteo al método Details. Este usa una sintaxis especial para definir el contenido variable, donde nosotros rodeamos el nombre de un parámetro con un par de llaves. Discutiremos más de esto a profundidad en este capítulo, pero por ahora, sólo está atento a que esto nos permite especificar un parámetro el Cuál será pasado al método correspondiente. Lo que significa en este caso es que podemos ahora cargar el producto con el ID pasado a través de la url y mostrarlo al usuario(en el ejemplo, sólo imprimimos el ID, para conservar la cosa simple). Nuestro controlador ahora soporta URLs como esta: /products/42 y /products/84/ (la última diagonal es opcional).
Por favor nota que solamente se usó la última parte de la URL en la plantilla de la ruta (el ID) porque el controlador ya específica que debe ser llamado con la palabra products primero. Si éste no fuera el caso, habríamos definido la URL completa para este método en específico en su lugar, como esto:
[Route("/products/{id}")]
public IActionResult Details(int id)
{
return Content("Product #" + id);
}
Así que, si lo definiste parcialmente para el controlador y parcialmente para el método, o lo especificaste completó en cada método, está en ti y en la situación. Podría ser útil definir lo todo en cada método si tú controlador debería soportar más de una URL entrada, pero en la mayoría de las situaciones, probablemente te ahorrarías algunos teclazos definiendo una entrada común para el controlador y y luego el resto para cada controlador.
Para algunas situaciones, puedes querer que un método tenga más de una ruta. Esto es logrado fácilmente, porque puedes definir tantas como tú quieras. Puedes incluso mezclar y relacionar URLs parcialmente y completamente definidas en un método en específico, como esto:
[Route("/products")]
public class ProductController : Controller
{
public IActionResult Index()
{
return Content("Products Index");
}
[Route("{id}")]
[Route("/product/{id}")]
public IActionResult Details(int id)
{
return Content("Product #" + id);
}
}
Con eso en su lugar, nuestra página product details puede ahora ser accesada usando las urls tanto en la forma singular como plural de la palabra "product". Este resultado específico podría ser completado en otras formas, con una ruta más flexible, pero sirve como una buena demostración de cuán fácil es definir múltiples rutas.
Resumen
El atributo de ruteo puede ser una gran alternativa a la forma convencional de definir rutas en tu proyecto. Ya que son definidas directamente en el controlador, puede ser más fácil de entender cuáles rutas son válidas para un controlador y método dado. En otra mano, hay algunas pocas limitaciones cuando se usa el atributo de ruteo, cuando vienen las restricciones de ruteo, pero la mayoría de las situaciones, esto no Debería ser un problema. Si caes en alguna de estas limitaciones, recuerda que eres libre de combinar el ruteo convencional con atributos de ruteo.
Así que, al final del día, si gustas atributos de ruteo o no ya será decisión personal y los requerimientos del proyecto en el que estés trabajando .