AspNet路由配置问题:如何让p2匹配带连字符的非通配贪婪参数?
解决ASP.NET MVC路由匹配多短横线URL的问题
首先,我们来拆解你的问题:你定义的路由{p1:int}-{p2}理论上应该能匹配/1-stuff-stuff,让p1=1、p2="stuff-stuff",因为路由参数p2默认会匹配除了路径分隔符/之外的所有字符(包括-)。你遇到的问题大概率是路由顺序不正确,或者对路由约束的生效逻辑理解有偏差。
下面给你两种可靠的解决方案:
方案一:调整路由顺序并保留int约束
路由匹配是按注册顺序进行的,如果你自定义的test路由在默认路由之后,/1-stuff-stuff可能会被默认路由(比如{controller}/{action}/{id})抢先匹配,导致你的自定义路由无法生效。
确保把你的自定义路由放在所有路由的最前面:
// 优先注册自定义路由 routes.MapRoute( name: "test", url: "{p1:int}-{p2}", defaults: new { controller = "test", action = "int" } ); // 再注册默认路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
这样/1-stuff-stuff会优先匹配你的自定义路由,p1会被正确解析为整数1,p2则完整捕获stuff-stuff(包括中间的-)。
方案二:使用正则约束明确匹配规则
如果你担心内置int约束的行为不够直观,可以改用正则约束来明确限定p1是整数,同时确保p2贪婪匹配所有后续内容:
routes.MapRoute( name: "test", url: "{p1}-{p2}", defaults: new { controller = "test", action = "int" }, constraints: new { p1 = @"\d+" } // 匹配一个或多个数字,等效于int约束 );
这个正则约束和内置int约束效果一致,但能更清晰地控制匹配规则,同样需要保证路由顺序优先。
为什么移除约束后p1变成"1-stuff"?
当你移除int约束后,路由系统会尝试尽可能匹配参数,但如果此时有其他路由(比如默认路由)的匹配优先级更高,或者你的路由模板被其他规则干扰,就可能出现p1错误捕获1-stuff的情况——这本质还是路由顺序或匹配逻辑的优先级问题,调整路由顺序就能解决。
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

