2009-06-03 156 views
1

我试图使像下面ASP.NET路由和正则表达式

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为 “ - ” 我们比赛进行到第路线,否则在其次。

回答

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一点。

+0

是的,似乎不可能创建一条单一路由的规则,由于解析正则表达式的方式。我有两条路线解决了这个问题。 – niaher 2009-06-08 01:59:11

0

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

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