TOC

This article has been localized into Spanish by the community.

Enrutamiento:

La anatomía de una ruta MVC

En este tutorial, ya hemos hablado sobre cómo puedes fácilmente iniciar con el soporte del ruteo básico gracias al ruteo por defecto. Sin embargo, es una gran idea entender cómo son definidas las rutas, porque en cierto punto seguramente necesitarás salirte del confort de la ruta por defecto/atrapa-todo y crear la tuya propia. Con eso en mente, hablemos un poco sobre cómo una ruta es definida y cómo es que ésta luce.

La parte más importante de una regla de ruteo es traducir una URL en un método de controlador. Para eso necesitamos la URL y el nombre del Controlador y el método. El sistema necesita poder identificar la regla (y quizás también quieres tener un recuerdo sobre el propósito de la regla, si tú tienes muchas de ellas), entonces también necesitamos darle a la regla un nombre.

Con eso en mente, vamos a intentar crear una regla muy básica. Cómo se mencionó, las reglas pueden ser definidas en varios formas y lugares, pero iniciaremos haciéndolo en el archivo Startup.cs, dentro del método Configure():

app.UseMvc(routes =>
routes.MapRoute("ProductList", "Products/List/", new { controller = "Products", action = "List" })
);

La llamada a MapRoute() toma varios parámetros - en este caso, nosotros proveemos un nombre para la ruta(el primer parámetro), la plantilla URL para la ruta(el segundo parámetro), también como un objeto de "defaults" (el tercer parámetro) el cual dirige la ruta al controlador deseado y al Método en ese controlador. Así que, eso es tu lugar, ahora podemos llamar a la URL http://localhost/Products/List, y el método List() en el ProductsController será llamado.

La plantilla Route

En el ejemplo de arriba, el parámetro más interesante es el segundo. Ese define la plantilla de la ruta y mientras que nuestra plantilla era muy simple, hay muchas más posibilidades, que te permiten soportar URLs muy complejas y sofisticadas. Primero que todo, puedes definir el controlador por defecto y el método o acción directamente en la plantilla, como esto:

routes.MapRoute("Default", "{controller=Home}/{action=Index}")

Esto es generalmente referido como ruteo convencional, porque consiste de al menos dos partes, donde la primera parte se refiere al método del controlador y la segunda parte se refiere a la acción o método. La tercera y opcional parte es usualmente un identificador, permitiéndote referir a una entidad en específico que quisieras mostrar, por ejemplo un producto en específico en lugar de una lista de productos y así. Puedes definir este parámetro ID opcional en la ruta también, usando una sintaxis especial. Ahora intentemos un ejemplo más complejo de una ruta, donde usaremos varias de las técnicas que hemos descrito:

app.UseMvc(routes =>
routes.MapRoute("Products", "Products/{action=Index}/{id?}", new { controller = "Products" })
);

La plantilla ahora se corresponde con URL's que comienzan con la palabra "products". Si nada más es especificado, tendrá por defecto la acción o método Index. De otro modo, si una acción es especificada en la segunda parte de la url, ésta será utilizada. Al final, tenemos un parámetro opcional ID - el hecho que sea opcional es notado con el uso de un signo de interrogación. Ahora soportamos las siguientes URLs:

  • /Products/
  • /Products/List/
  • /Products/Details/32/

El controlador para manejar todos estos escenarios puede lucir así:

public class ProductsController : Controller
{
public IActionResult Index()
{
    return Content("Product overview");
}

public IActionResult List()
{
    return Content("Product list");
}

public IActionResult Details(int id)
{
return Content("Product details for #" + id);
}
}

Nota especialmente el método Details - tiene un parámetro llamado "id", igual igual a al parámetro que especificamos en la ruta. Esto significa que si tú llamas la URL Details, ¡el ID que agrega automáticamente será pasado como el parámetro ID al método Details!

Cómo puedes ver, el sistema de plantillas de ruteo es muy flexible y te permite soportar muchas variaciones diferentes de URL. Hay más posibilidades, las cuales veremos después en este tutorial, pero esperamos que estos ejemplos hayan dado una buena idea de cuán poderoso son los mecanismos de ruteo en ASP.NET Core MVC.

Múltiples rutas

Como se mencionó previamente, tú puedes tener más de una ruta en tu aplicación. De hecho, el enfoque más común es tener una ruta por defecto, como vimos en el artículo previo, pero conservándolo al final de la lista de todas las rutas. Por qué? Porque las reglas de ruteo son procesadas de arriba hacia abajo, hasta que se encuentre una correspondencia - cuando una correspondencia ocurre, no se procesan más rutas. En otras palabras, debes de tener tu reglas más específicas al inicio y conservar las reglas menos específicas al final. Esto podría verse así:

app.UseMvc(routes =>  
{  
routes.MapRoute("Products", "Products/{action=Index}/{id?}", new { controller = "Products" });  
routes.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}");  
});

Nota como tengo una regla muy específica al principio (para productos), y luego la regla por defecto, en el final. Esto asegura que, incluso si no has definido una ruta específica para una combinación de controlador/acción, se tratará de alcanzarla si existe - si no existe, terminará cayendo en el método Index() de HomeController.

Resumen

Por ahora, debes tener una mejor idea sobre cómo funciona el ruteo y cómo definir tus propias Rutas. Durante los siguientes artículos, veremos más opciones disponibles que tienes cuando defines tus rutas, así como también otras formas de usar mecanismos de ruteo de ASP.NET MVC.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!