aspnetcore-routing-convencional

Qué es y cómo usar el enrutamiento convencional en ASP.NET

  • 2 min

El enrutamiento convencional es el sistema tradicional de mapeo de URLs en ASP.NET que utiliza patrones predefinidos para determinar qué controlador y acción deben manejar una solicitud HTTP específica.

El enrutamiento convencional establece reglas globales que se aplican a toda la aplicación, generalmente en Program.cs (o Startup.cs en versiones anteriores).

Aunque las APIs mínimas y el routing por atributos son más comunes en proyectos modernos, aún os podéis encontrar routing convencional en aplicaciones grandes o en migraciones desde versiones anteriores.

Y es bastante horrible así que si podéis no tener que usarlo, mejor que mejor. Pero por si os toca, vamos a ello 👇

¿Cómo funciona el Routing Convencional?

El enrutamiento convencional se basa en convenciones predecibles que siguen el patrón estándar de {controller}/{action}/{id?}.

Este enfoque permite que ASP.NET mapee automáticamente las URLs a los controladores y acciones correspondientes sin necesidad de configuración adicional en cada método.

Las rutas convencionales siguen un patrón de URL con este formato:

"{controller=Home}/{action=Index}/{id?}"

Esto significa:

  • controller: el nombre del controlador (por defecto es Home).
  • action: el método dentro del controlador (por defecto es Index).
  • id?: parámetro opcional que se puede usar como identificador.

Configurando el enrutamiento convencional

Los patrones de enrutamiento se aplican usando métodos como MapControllerRoute o MapDefaultControllerRoute.

Vamos a verlo como se aplicaría el routing convencional con un ejemplo sencillo,

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews(); // Habilita MVC

var app = builder.Build();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();
public class ProductsController : Controller
{
    public IActionResult Details(int id)
    {
        // Aquí iría la lógica para obtener el producto con ese id
        return Content($"Mostrando el producto con ID = {id}");
    }
}

Con esta configuración,

  • Ua URL como /Products/Details/5 se mapeará al controlador ProductsController
  • Acción Details,
  • Se le pasará el valor 5 como parámetro id.

Routing avanzado

Por supuesto, al igual que con el routing por atributos, es posible realizar sistemas de routing más avanzado, si lo necesita nuestro proyecto.

Vamos a ver algunos de ellos.

Ruta con controlador fijo

app.MapControllerRoute(
    name: "blog",
    pattern: "blog/{action}/{id?}",
    defaults: new { controller = "Blog" });

Aquí, cualquier ruta que comience con /blog siempre se dirigirá al BlogController, con la acción y el id como parte dinámica.

Ruta con múltiples parámetros

app.MapControllerRoute(
    name: "blogPost",
    pattern: "blog/{year}/{month}/{day}",
    defaults: new { controller = "Blog", action = "Post" });

Una URL como /blog/2023/10/05 se dirigirá a BlogController.Post(int year, int month, int day) con los parámetros correspondientes.