.NET Core 8如何配置多控制器路由以支持SEO友好路径
问题描述
原有的.NET Core 8控制器路由配置如下:
var webApplication = builder.Build(); webApplication.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
该配置支持以下路由正常访问:
https://example.com https://example.com/Home https://example.com/Books https://example.com/Books/Show/1
现在需要新增支持SEO友好的路由(如https://example.com/Books/Show/my-book-name),同时保留原有路由逻辑,且不想为每个Action单独配置路由。尝试了以下配置但无法正常工作:
var webApplication = builder.Build(); webApplication.MapControllerRoute("default-uri", "{controller}/Show/{uri}"); webApplication.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
解决方案
问题根源
你添加的default-uri路由未指定action参数,路由系统无法匹配到对应的Show方法;同时路由匹配遵循从上到下的优先级顺序,即使参数正确,顺序错误也会导致匹配失败。
可行实现方式
方式一:调整全局路由模板与顺序
将自定义路由放在默认路由之前,并明确指定对应action,确保路由系统能正确匹配到Show方法:
var webApplication = builder.Build(); // 优先匹配带SEO友好URI的路由 webApplication.MapControllerRoute( name: "show-with-uri", pattern: "{controller}/Show/{uri}", defaults: new { action = "Show" } ); // 保留原有默认路由逻辑 webApplication.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}" );
方式二:单路由模板兼容ID与URI
通过参数约束让同一个路由模板同时支持数字ID和字符串URI,无需新增额外路由:
var webApplication = builder.Build(); webApplication.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{param:regex(^\\d+$|^[a-z0-9-]+$)?}", defaults: new { param = (string?)null } );
之后在BooksController的Show方法中处理参数:
public IActionResult Show(string? param) { if (int.TryParse(param, out int bookId)) { // 根据数字ID查询书籍 } else if (!string.IsNullOrEmpty(param)) { // 根据URI别名查询书籍 } // 后续业务逻辑 return View(); }
方式三:属性路由结合全局路由
无需修改全局路由,直接在Action上声明多路由模板,同时支持原有ID路由和新URI路由:
public class BooksController : Controller { [Route("Books/Show/{id:int}")] [Route("Books/Show/{uri}")] public IActionResult Show(string? id, string? uri) { var queryKey = id ?? uri; // 根据queryKey查询书籍 return View(); } }
内容的提问来源于stack exchange,提问作者Bagzli
相关产品推荐
相关产品推荐

