2012-04-05 52 views
3

對於問一個相當不錯的問題,我對ASP.NET MVC來說是個新手。 我的問題是:MVC 3 Fall-through routing

我希望我的網站,以下列方式處理網址:

www.mysite.com/homepage/name 

我想上面的鏈接轉到該用戶的個人資料。爲了簡單起見,控制器將作爲主控制器與測試行動。

意思就是在Global.asax路由將是:

routes.MapRoute(
      "test", 
      "homepage/{name}", 
      new { controller = "Homepage", action = "Test" } 
      ); 

截至目前爲止代碼的偉大工程(我已經測試它和它的路線確定)。

但現在我的其他的功能,我想是使:

www.mysite.com/homepage/action/id 

要正常工作。

該路由將是:

routes.MapRoute(
      "Default", 
      "homepage/{action}/{id}", 
      new { controller = "Homepage", action = "Index", id = UrlParameter.Optional } 
     ); 

問題是,當用戶想要省略{ID}一個動作會發生什麼,路由表中檢測到動作名稱實際上是{名}參數。

有沒有什麼辦法可以先檢查一個動作是否存在。並且只有在沒有的情況下,纔可以將其用作不同路線的參數。

有意義嗎?如果沒有,我會添加更多的細節。

謝謝!

編輯

所以我已經成功利用此約束的正則表達式 我把定義在我的控制器中的所有動作的正則表達式來解決:

routes.MapRoute(
      "homepage", 
      "homepage/{action}/{id}", 
      new { controller = "Homepage", action = "Index", id = UrlParameter.Optional }, 
      new { action = "(action1|action2|action3)" } 
      ); 

再下一條規則:

routes.MapRoute(
      "feed", 
      "homepage/{id}", 
      new { controller = "Homepage", action = "Test"} 
      ); 

我工作正常,只有這很難衡量。您需要記住將這些控制器中的每個新動作放在字符串中。這是調試惡夢的巨大開局。

謝謝!

+0

如果用戶創建一個名爲Index的帳戶,或者您的操作名稱是什麼,會發生什麼? – 2012-04-05 15:01:21

+0

我猜這一切都需要與數據庫管理同步。這是一個很好的問題。我們這樣做的方式是自己產生slu so,所以我們有權保留一些字符串。 – oamsel 2012-04-05 15:28:36

+0

我想我的觀點是,通過使用不同的路徑來設計事物真的會更好,所以這種混淆不會發生。 – 2012-04-05 15:42:43

回答

0

你需要首先把Default路線,同時也限制了它的允許值

routes.MapRoute(
      "Default", 
      "homepage/{action}/{id}", 
      new { controller = "Homepage", action = "Index", id = UrlParameter.Optional }, 
      new {action = @"Index|Delete|Add"} 
     ); 

routes.MapRoute(
      "test", 
      "homepage/{name}", 
      new { controller = "Homepage", action = "Test" } 
      ); 

這樣,如果行動值匹配一個約束中所提供的第一路由只被使用,否則會動到下一個規則。

您還必須確保在創建用戶配置文件時,沒有任何名稱應與default路由支持的其中一個操作相匹配。

+0

謝謝。正如我編輯這篇文章,它的工作原理。但很難擴展。非常感謝 ! – oamsel 2012-04-05 13:39:19

+0

@Omer,如果你想***在飛行***檢查是否存在動作,然後看看這個答案從瘋狂[如何確保控制器和動作存在之前做重定向,asp.net mvc3] (http://stackoverflow.com/a/7036978/128165) – 2012-04-05 13:48:30

+0

它看起來不錯。有沒有可能會減慢我的路線?這裏有效率損失嗎? – oamsel 2012-04-05 13:54:26

1

由於ASP.NET MVC從RouteTable中選擇與當前請求相匹配的第一條路由,因此應該可以通過更改Global.asax中路由的順序來解決此問題。

第一本:

routes.MapRoute(
      "Default", 
      "homepage/{action}/{id}", 
      new { controller = "Homepage", action = "Index", id = UrlParameter.Optional } 
     ); 

,然後這樣的:

routes.MapRoute(
      "test", 
      "homepage/{name}", 
      new { controller = "Homepage", action = "Test" } 
      ); 

希望這有助於。

+1

這種方式第二條路線永遠不會到達..你應該對'action'使用一個約束來只允許一個特定的列表'actions' – 2012-04-05 13:08:47

+0

是的,你是對的。 – philipproplesch 2012-04-05 13:19:00

+0

它沒有幫助。它仍然試圖將「id」字段解析爲一個操作並返回404找不到。 – oamsel 2012-04-05 13:19:15