2010-08-11 54 views
0

我有一個路線定義爲這樣:ActionLink的與routeValues創建舊斯庫爾風格的URL

<%: Html.ActionLink("Click here", "Schedule", "Customer", new { sn = "KingKong89", new { @class="topLink" })%> 

產生的超級鏈接/ URL:

routes.MapRoute(
     "CustomerWithScreenName", // Route name 
     "Customer/{sn}/{action}", // e.g. Customer/KingKong89/Schedule 
     new { controller = "Customer", action = "Signup", id = "" } // Parameter defaults 
    ); 

但是,當我使用的ActionLink這樣制定的鏈接出來是這樣的:

http://localhost:65071/Customer/Schedule?sn=KingKong89

它的工作原理,但我EXPE反恐執行局的ActionLink使用已知的路線和建設的正確鏈接具體做法是:

http://localhost:65071/Customer/KingKong89/Schedule

是我的期望錯了嗎?它是如何工作的參數化URL?

注意:我沒有在路由中指定{controller}。我似乎無法將這條路線與更正統的{控制器} {動作} {id}路線相混合 - 也許我應該停止嘗試變得聰明並採用慣例。

感謝您的幫助。盧克。

UPDATE

我有一個理論,如果沒有合適的途徑(包括{}控制器特殊的關鍵字),我將無法使ActionLink的產生正確的URL。

所以我現在把我的目光投向了爲什麼這個簡單的路線不工作:

routes.MapRoute(
     "ControllerWithScreenName", // Route name 
     "{controller}/{sn}/{action}", // e.g. Customer/Dave/Schedule 
     new { controller = "Customer", action = "Signup", sn = "" } // Parameter defaults 
     ); 

作爲唯一的途徑,用默認的「根」一起,它不會起球。如果控制器名稱是專門添加的(如上面的第一個代碼段所示)。在盛大的一個小東西 -

更新2

由於時間有限,我對我的PARAM前方的動作風格URL放棄,並回到默認的控制器\行動\參數進步的方案,而不是感到沮喪和鬱悶。

更新3

我會以取消我所有的智能屁股路線和嘗試使用RouteLink並指定路線使用的類型。我認爲這是RouteLink評論的存在理由。

UPDATE 4

這也是白搭。這要求應用程序瞭解要採取的路線,這意味着我將失去將來僅改變路線的選項,並讓所有鏈路自動更新。

回答

1

第一件事情,你用一個未使用的參數定義你的路線,你應該定義你的路線是這樣

routes.MapRoute(
    "CustomerWithScreenName", // Route name 
    "Customer/{sn}/{action}", // e.g. Customer/KingKong89/Schedule 
    new { controller = "Customer", action = "Signup", sn= "" } // Parameter defaults 
); 

sn在你的定義是不是在你的參數定義的,而不是你定義id。在默認路由之前定義您的路由。

其次,你的ActionLink的應該是這樣的

<%= Html.ActionLink("Click here", "Schedule", "Customer", new { sn = "KingKong89" }, new { @class = "topLink" })%> 

最後,在你的控制,你的動作方法Schedule參數應該是sn沒有id

public ActionResult Schedule(string sn) 
{ 
    return View(); 
} 
+0

喜羅布,並感謝您幫幫我。我糾正了路徑(id> sn),第二個是這裏的錯字,第三個已經是如何設置的。它仍然在生成舊的網址。我要進一步調查。 – 2010-08-11 11:35:41

+0

你確定嗎?在我發佈之前,我已經測試過這個版本,並且它在我的最後工作正常。 – 2010-08-11 11:45:32

+0

我只是再次測試,以確保我得到:

  • LukeSkywalker
  • 在源。我放棄並使用標準。點點吧 - 沒有時間。如果我寫MVC 2,我會通過屬性和模糊匹配邏輯來設置自己的路由集。再次爲您的幫助歡​​呼。讚賞。 – 2010-08-11 12:12:58