ASP.NET路由和正则表达式

时间:2009-06-03 12:24:11

标签: asp.net routing

我正在尝试启用类似以下的路线

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是“ - ”,我们匹配第一条路线,否则匹配第二条路线。

2 个答案:

答案 0 :(得分: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,则可能需要稍微改变一下您的网址的组织方式

答案 1 :(得分:0)

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

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