2011-10-07 45 views
1

我正在嘗試做什麼,因爲它的問題控制器。爲什麼使用錯誤的路線?

  • /Posts/{id}/{title}查看後(動作名稱未顯示)
  • /Posts/New時,當你發佈新的東西。
  • /Posts/Delete/10等....

我有兩條路線設置(當然,一個如果你不指望默認值)。似乎正在發生的事情是郵政控制器中的所有操作都通過第一個操作。

那是什麼?我顯然有錯,但我無法弄清楚。

routes.MapRoute("ViewPosts", 
    "Posts/{postid}/{title}", 
    new { controller = "Posts", action = "View", postid = "", title = "" }); 

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

回答

1

第一條路線處理您從/Posts開始的所有請求。

您需要使用的限制,允許{postid}只有數:

routes.MapRoute("ViewPosts", 
    "Posts/{postid}/{title}", 
    new { controller = "Posts", action = "View", postid = "", title = "" }, 
    new { postid= @"\d+" }); 

只有當數字ID提供這條路線將處理它這種情況下,否則「默認」的路線會處理。

+0

使用該規則'/ Posts'會發生什麼,而沒有其他?它仍然會匹配。 (這可能是也可能不是這個意圖) –

+0

這條規則仍然有效。約束僅在'{postid}'參數上定義。 – Samich

+0

謝謝,那種工作。 (好吧,沒有錯誤拋出)。然而,現在類似'/ edit/10'的行爲正在顯示'/ edit?id = 10' – Joe

1

所有路由都經歷了第一,因爲你沒有指定的postid場只能是數字,或定義,將捕獲/Posts/New較早的路線。它通過New作爲postidView操作。

您可以之前添加此路由定義你現在有那些:

routes.MapRoute("NewPost", 
    "Posts/New", 
    new{controller="Posts", action="New"}); 

或任何適當的控制器/動作會。

+0

那麼我需要爲該控制器中的每個其他操作設置路由嗎? – Joe

+0

也許只是一個捕獲所有非postid路由並將它們發送到適當命名的操作。像'routes.MapRoute(「OtherPost」,「Posts/{action}/{id}」,new {controller =「Posts」},new {action =「^ [^ 0-9]」});'which would捕獲所有不以數字開頭的網址,將這些網址留給現有網址。 –