【问题标题】:ASP.NET Routing and Regular ExpressionsASP.NET 路由和正则表达式
【发布时间】:2009-06-03 12:24:10
【问题描述】:

我正在尝试启用如下路线

route = new Route("{w1}-{c1}-{n1},{w2}-{c2}-{n2}", new ResultRouteHandler());
route.Constraints = new RouteValueDictionary();
route.Constraints.Add("c1", "(.*)|([-])");
route.Constraints.Add("c2", "(.*)|([-])");
RouteTable.Routes.Add(route);

但是当 c1 或 c2 为“-”时我遇到了问题。例如“a-b-c,d---f”返回 404(而“a-b-c,d-e-f”工作正常)。有人知道我在做什么错吗?提前谢谢你。

编辑:

我为这个问题找到了一个简单的解决方法:

route = new Route("{w1}-{c1}-{n1},{w2}---{n2}", new MyRouteHandler());
RouteTable.Routes.Add(route);
route = new Route("{w1}-{c1}-{n1},{w2}-{c2}-{n2}", new MyRouteHandler());
RouteTable.Routes.Add(route);

如果 c2 是“-”,我们匹配第一个路由,否则匹配第二个。

【问题讨论】:

    标签: asp.net routing


    【解决方案1】:

    如果我理解正确,您确实想要匹配 "a-b-c,d---f",这就是您首先要调整约束的原因。尽管'-' 将与'.*' 匹配,但您拥有的正则表达式有点多余。换句话说,我不认为你的正则表达式应该受到责备,而是路由引擎解析器。

    如果您将路线从 "{w1}-{c1}-{n1},{w2}-{c2}-{n2}" 更改为 "{w1}-{c1}-{n1},{w2}_{c2}-{n2}",则 c2 将开始匹配 "a-b-c,d_--f" 中的 '-'。我认为路由解析不喜欢使用分隔符作为下一个值。

    所以我认为你可以放弃你的约束(因为它们目前存在),但如果你希望 '-' 成为 c1c2,你可能需要稍微不同地组织你的 URL。

    【讨论】:

    • 是的,由于正则表达式的解析方式,似乎无法使用单个路由创建规则。我通过两条路线解决了这个问题。
    【解决方案2】:

    我对正则表达式的实现不是 100% 肯定,但我认为它应该是这样的:

    route.Constraints.Add("c1", "([^-]*)");
    route.Constraints.Add("c2", "([^-]*)");
    

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 2011-06-01
      • 2012-06-28
      • 2015-10-23
      • 1970-01-01
      • 2020-09-25
      • 2020-10-10
      • 2019-01-01
      • 2014-04-14
      相关资源
      最近更新 更多