You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC 5中如何用正则实现URL路由的可选字符串段?

解决方案

要实现同时匹配hot-dogs/和hot-dogs-with-mustard/的路由,你需要调整路由模板的两个核心要点:

  1. 将路由参数段标记为可选(在参数名后加?)
  2. 修正正则表达式,使其能匹配空字符串或目标固定段-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()

原代码问题分析

你之前的写法存在两处关键错误:

  1. 正则(-with-mustard?)中的?仅作用于最后一个字符d,实际匹配的是-with-mustar(少一个d)或-with-mustard,无法匹配空字符串
  2. 参数段未标记为可选,因此URL必须包含该段内容,导致无法匹配hot-dogs/

内容的提问来源于stack exchange,提问作者W. Bowley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:45:46