2011-02-12 41 views
5

我正在嘗試使用ASP.Net MVC 3編寫一個非常簡單的CMS系統原型。如何讓這個ASP.NET路由正常工作?

系統具有一個控制器,其中包含兩個操作:show和create。

「顯示」操作的格式最多需要5個可選部分,例如, domain.com/part1/part2/part3/part4/part5

「顯示」操作的格式類似,但應具有領先的「創建」部分。 domain.com/create/part1/part2/part3/part4/part5

我有我的Global.asax以下設置:

routes.MapRoute(
     "CreatePageRoute", 
     "create/{part1}/{part2}/{part3}/{part4}/{part5}", 
     new 
      { 
       controller = "Page", 
       action = "Create", 
       part1 = UrlParameter.Optional, 
       part2 = UrlParameter.Optional, 
       part3 = UrlParameter.Optional, 
       part4 = UrlParameter.Optional, 
       part5 = UrlParameter.Optional 
      }); 

    routes.MapRoute(
     "Default", 
     "{part1}/{part2}/{part3}/{part4}/{part5}", 
     new 
      { 
       controller = "Page", 
       action = "Show", 
       part1 = UrlParameter.Optional, 
       part2 = UrlParameter.Optional, 
       part3 = UrlParameter.Optional, 
       part4 = UrlParameter.Optional, 
       part5 = UrlParameter.Optional 
      } 
     ); 

如果我的「顯示」方法無法找到頁面匹配提供的路徑,它會返回一個'not found'頁面,其中包含一個選項,用於使用提供的路徑創建一個新頁面。此鏈接使用以下定義:

@Html.ActionLink("Yes", "Create") 

[「是」代表問題的答案「嗎?你想爲這條道路創建一個網頁」]

因此測試「默認時「路線,我看到我的 '顯示' 操作成功地呼籲所有以下路徑: {空} 一個 A/b A/b/C A/b/C/d A/b/c/d/e

這很棒。

但是,由語句「@ Html.ActionLink(」是「,」Create「)生成的」創建「鏈接會產生不一致的結果。它似乎根據輸入的長度生成不同的超鏈接。結果如下:

對於路徑「{空}」,鏈接提供「本地主機{:端口} /」 - 我所期待的「本地主機{:端口} /創建」

對於路徑「/a「,鏈接提供」localhost {:port} /「 - 我希望」localhost {:port}/create/a「

對於路徑」/ a/b「 :port}/a「 - 我希望」localhost {:port}/create/a/b「

對於路徑」/ a/b/c「,鏈接提供」localhost {:port}/a/b「 - 我希望」localhost {:port}/create/a/b/c「

對於路徑「/ a/b/c/d」,鏈接提供「localhost {:port}/create/a/b/c/d」 - 這正是我所希望的

對於路徑「/a/b/c/d/e「,鏈接提供」本地主機{:端口} /創建/ a/b/c/d/e「 - 這正是我所希望的

爲什麼只有它當我提供「/ a/b/c/d」或「/ a/b/c/d/e」時工作嗎?

我知道我是愚蠢的,請幫我

桑迪

+0

後來我有一個類似的問題。嘗試更改`UrlParameter.Optional`只是`「」` – Omar 2011-02-12 07:29:28

回答

1

我相信,多個可選參數是造成discrepency。
如何:

routes.MapRoute("Create5", "create/{part1}/{part2}/{part3}/{part4}/{part5}", new { controller = "Page", action = "Create", part5 = UrlParameter.Optional }); 
    routes.MapRoute("Create3", "create/{part1}/{part2}/{part3}", new { controller = "Page", action = "Create", part3 = UrlParameter.Optional }); 
    routes.MapRoute("Create1", "create/{part1}", new { controller = "Page", action = "Create", part1 = UrlParameter.Optional }); 

    routes.MapRoute("Default5", "{part1}/{part2}/{part3}/{part4}/{part5}", new { controller = "Page", action = "Show", part5 = UrlParameter.Optional }); 
    routes.MapRoute("Default3", "{part1}/{part2}/{part3}", new { controller = "Page", action = "Show", part3 = UrlParameter.Optional }); 
    routes.MapRoute("Default1", "{part1}", new { controller = "Page", action = "Show", part1 = UrlParameter.Optional }); 
+0

非常感謝,這很好地訣竅。此外,您的解決方案通過審慎使用可選參數減少了所需路線的數量,這種照明方式非常具有啓發性。感謝您的幫助。 – sandy 2011-02-13 00:34:03