2012-08-09 103 views
0

我有一個webforms 4項目,我使用url路由Webforms 4 url​​路由多個匹配

在某些情況下,給定的路線可以匹配多個模式。

似乎路由機制以特定順序嘗試每個模式,並停止在第一個匹配。 (糾正我,如果我錯了)。如果所選模式的資源(主要是一個aspx文件)不存在,我們有一個404錯誤(資源不存在)。

下一個匹配模式映射到現有資源,但該機制不會嘗試。

實施例(使用類似於對MVC命名約定)

routes.MapPageRoute("Action", "{controler}/{action}/{*pathInfo}", "~/Views/{controler}/{action}.aspx"); 
routes.MapPageRoute("Overview", "{controler}/{*pathInfo}", "~/Views/{controler}/Overview.aspx"); 

因此,有一個/Views/Patient/Overview.aspx和/Views/Patient/Search.aspx的文件系統上。

路線「/患者」將匹配所述第二圖案和映射到「/Views/Patient/Overview.aspx

路線「/患者/搜索」將匹配第一圖案映射到「/Views/Patient/Search.aspx

路線「/人/搜索/ SomePathInfo」將匹配第一圖案和映射到「/查看/人/海rch.aspx 「(治療」 SomePathInfo」的URL的一部分的{*} panthinfo一部分)

現在,問題是,路線 「/患者/ SomePathInfo」 兩個圖案相匹配。第一個將「SomePathInfo」視爲{action}部分(搜索不存在的「/Views/Patient/SomePathInfo.aspx」)。第二個將「SomePathInfo」視爲{* pathInfo}部分,並映射到現有的「/Views/Patient/Overview.aspx」。

該機制雖然嘗試第一個,但它找不到SomePathInfo.aspx文件,並引發404錯誤。

我的問題是「有沒有辦法來引導機制,以嘗試每個模式,直到它找到一個現有的資源(或者,更一般的,直到某些條件得到滿足?[點擊這裏:resource.exists] 「!

回答

0

一種解決方法,以上述我的問題是使用佈線約束以及定義一組有限的可用值的{動作}佔位符。這同樣適用於{控制器}佔位符等

所以我定義一個約束來僅接受列表中的動作:「索引」,「細節」,「添加」,「編輯」,「選擇」等,以及控制器在「家」,「病人」,「事件」等列表中;

routes.MapPageRoute("Action", "{controler}/{action}/{*queryValues}", "~/Views/{controler}/{action}.aspx", true, 
      new RouteValueDictionary { // Default values 
       { "controller", "home"}, 
       { "action", "index"} }, 
      new RouteValueDictionary { // constraints 
       { "controller", "home|patient|incident"}, 
       { "action", "index|details|add|delete|edit|select"} }); 

這樣,當我輸入類似「患者/ somequery」中,「somequery」字符串不滿足這種映射的約束,所以該機制continoues到下一個和對待「somequery」部分作爲{* queryvalues}而不是{action}。

但問題仍然成立:

有沒有辦法來引導機制,以嘗試每個模式,直到它找到一個現有的資源(或者,更一般的,直到某些條件得到滿足[? here:resource.exists]