ASP.NET MVC 5中如何用正则实现URL路由的可选字符串段?
解决方案
要实现同时匹配hot-dogs/和hot-dogs-with-mustard/的路由,你需要调整路由模板的两个核心要点:
- 将路由参数段标记为可选(在参数名后加
?) - 修正正则表达式,使其能匹配空字符串或目标固定段
-with-mustard
带参数的正确实现
如果需要在方法中接收可选段的取值,使用以下代码:
[HttpGet] [Route("~/hot-dogs{withMustard:regex(^(-with-mustard)?$)?}/", Name = "HotDogOrder")] public async Task<ActionResult> HotDogOrder(string withMustard = null)
关键细节解释
{withMustard:...?}:末尾的?标记整个参数段为可选,即URL中可以完全省略这部分内容- 正则
^(-with-mustard)?$:^和$确保匹配整个参数段的完整内容,避免出现部分匹配的错误(-with-mustard)?表示要么匹配空字符串,要么精确匹配-with-mustard
无参数的简化方案
如果不需要在方法中获取可选段的取值,可直接使用路由模板的原生可选语法,无需正则约束:
[HttpGet] [Route("~/hot-dogs(-with-mustard)?/", Name = "HotDogOrder")] public async Task<ActionResult> HotDogOrder()
原代码问题分析
你之前的写法存在两处关键错误:
- 正则
(-with-mustard?)中的?仅作用于最后一个字符d,实际匹配的是-with-mustar(少一个d)或-with-mustard,无法匹配空字符串 - 参数段未标记为可选,因此URL必须包含该段内容,导致无法匹配
hot-dogs/
内容的提问来源于stack exchange,提问作者W. Bowley
相关产品推荐
相关产品推荐

