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 esHome
).action
: el método dentro del controlador (por defecto esIndex
).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 controladorProductsController
- Acción
Details
, - Se le pasará el valor
5
como parámetroid
.
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.