2009-06-03 87 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", "([^-]*)");