如何将多个请求路由到同一个ASP.NET控制器?
多URL指向同一控制器方法的解决方案
方案一:启用并正确使用属性路由
你之前的[Route]特性无效,大概率是因为没启用属性路由。在ASP.NET MVC中,需要先在RouteConfig.cs(或Global.asax的路由配置代码里)开启属性路由:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // 必须先添加这行,启用属性路由 routes.MapMvcAttributeRoutes(); // 其他默认路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
开启后,你的多[Route]特性写法就能生效,直接给同一个方法添加多个路由特性即可:
[Route("abc_1")] [Route("abc_2")] public ActionResult Index() { return Json("OK"); }
如果后续还有类似abc_3、abc_4的URL,也可以用路由模板批量匹配:
// 匹配abc_1、abc_2、abc_3...任意数字后缀的URL [Route("abc_{num:int}")] public ActionResult Index(int num) { // 可以通过num参数区分不同请求,方便后续扩展 return Json($"OK, num: {num}"); }
方案二:在全局路由中配置匹配规则
如果不想用属性路由,也可以在RouteConfig.cs里通过MapRoute配置统一的路由规则,指定匹配模式和约束:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // 新增针对abc_*的路由,优先级要高于默认路由 routes.MapRoute( name: "AbcMultipleRoutes", url: "abc_{suffix}", defaults: new { controller = "Abc", action = "Index" }, // 约束后缀只能是1或2,精准匹配你的需求 constraints: new { suffix = @"1|2" } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
这样所有/abc_1、/abc_2的请求都会自动路由到AbcController的Index方法。如果需要后续扩展后缀,只修改约束里的正则即可(比如改成@"1|2|3")。
内容的提问来源于stack exchange,提问作者Alex Pertenava
相关产品推荐
相关产品推荐

