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 glúteo 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 como una ruta definida y cómo es que esta 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, por qué 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 igual a a las web que empiezan con la palabra "products". Sí nada más es especificado, tendrá por defecto la acción o método Index. De otro modo, sí una acción es especificado en la segunda parte de la url, esta será usada. 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 Roma el sistema de plantillas de ruteo es muy flexible y se permite soportar muchas variaciones diferentes de Url. Hay más posibilidades, las cuales veremos después en este tutorial, pero porque estos ejemplos que hayan dado una buena idea de cuán poderoso son los mecanismos de ruteo en ASP.NET Core MVC.

Múltiples rutas

Como previamente se mencionó, fue desde luego tener más de una ruta en tu aplicación. De hecho, el enfoque más comunes tener una ruta por defecto, como vimos en el artículo previo, pero conservando lo en el fondo de la lista de todas las rutas. Porque? Porque las reglas de ruteo son procesadas de arriba hacia abajo, hasta que se encuentre una relacionada- cuando una relación ocurre, no más de una ruta es procesada. 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(productos Terra paréntesis, y luego la regla por defecto, en el final. Esto asegura que incluso si no has definido una ruta en específico para una combinación de controlador/ acción, esto tratará de alcanzar lo si es que existe- si no existe, terminará cayendo en el método Index() en el HomeController.

Resumen

Por ahora, debes tener mucha 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 qué tienes cuando defines tus rutas, también como 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!