2010-01-25 83 views
0

我想在基於ASP.NET MVC的網站上有一頁,其中一頁允許通過用戶名而不是ID進行選擇。我本來以爲的路徑必須是這樣的:ASP.NET路由傳遞字符串值

routes.MapRoute(
    "CustomerView", "Customer/Details/{username}", 
    new { username = "" } 
); 

routes.MapRoute(
    "Default", "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = "0" } 
); 

但每當我使用HTML.Actionlink我得到http://mysite.com/Customer/Details?username=valuehere。我認爲像普通的路線:

routes.MapRoute(
    "CustomerView", "Customer/Details/{username}", 
    new { controller="Customer", action = "Details", username = "" } 
); 

,但我想這將導致更多的問題時,應採用兩個失誤是哪條路線。

回答

1

我不知道我完全理解這個問題......你說你想要的:

  1. 一個路線{controller}/{action}/{username},處理的URL,其中第三個符號是一個字符串,匹配動作,其中有一個字符串「用戶名」參數,並

  2. 其他路由{controller}/{action}/{id}處理的URL其中第三個標記是一個整數,匹配有整數「ID」參數的行動?

如果是這樣,檢查出來,需要一個4th argument specifying route constraintsoverload for MapRoute。它應該讓你做這樣的事情:

routes.MapRoute(
    "CustomerView", "{controller}/{action}/{username}", 
    new { controller="Customer", action = "Details", username = "" } 
    new { username = @"[^0-9]+" } 
); 

這(未經測試)的約束應該引起{用戶名}路線到第三個符號包含至少一個非數字字符匹配任何內容。

當然,如果用戶名完全由數字組成的話是合法的,那麼這可能對您無效。在這種情況下,您可能需要爲每個接受用戶名而不是ID的操作創建專用路由。

+0

雖然我已經研究過如何解決我的特定問題,但是關於路線如何映射的解釋還是非常有幫助的,無論如何我都會將其標記爲答案。 – nathanchere

1

這工作:

routes.MapRoute(
    "CustomerView", "Customer/Details/{username}", 
    new { controller="Customer", action = "Details", username = "" } 
); 

但在上述的問題,我在第二個例子中所犯的錯誤是我的意思是:

routes.MapRoute(
    "CustomerView", "{controller}/{action}/{username}", 
    new { controller="Customer", action = "Details", username = "" } 
); 

這只是意味着我必須明確申報的路線對於我傳遞字符串值的每個實例。

2

您的客戶控制器的Details方法是否有一個「username」參數,而不是一個id參數?

如果參數不匹配,則它們會作爲查詢字符串變量追加。

+0

它確實有一個用戶名參數。 – nathanchere

相關問題