1

我想要有一個UserName(可以更改)和UserId的路由選項。通過這種方式,用戶可以得到一個簡單的好處要記住網址Users/{UserName}有一個將保證永遠不會改變Users/{UserId}如何保持URL路由DRY

沿着有什麼辦法來避免寫2條路線有用戶爲基數每路線?從評論

編輯我想避免的方法處理這,還。我寧願在路由中處理它。

+0

不,他們是不同的類型 – 2013-03-01 05:22:51

+0

第二個想法,你可以使用相同的路線的字符串,然後檢查傳遞的參數是否可以被視爲int。 – 2013-03-01 05:32:27

+0

@DaveA Yah,我想過那個,但是那看起來有點像哈克...... – 2013-03-01 05:36:49

回答

0

要確定請求是否在UserId或UserName中傳遞,您需要確定輸入參數是int還是字符串。您有此兩種選擇:

  1. 製作的操作方法
  2. 決心讓路由的決心。

如果您在操作方法中做出決定,那麼您可以在單個路由中處理這兩種情況。您將通過設置路線如下處理這個問題:

routes.MapRoute("", "User/{userSpecifier}", 
    new { controller = "Home", action = "Index" }); 

然後,在您的主頁控制器Index操作方法,你需要檢查是否輸入的參數爲int或字符串,通過代碼如下:

public ActionResult Index(string userSpecifier) 
{ 
    int userId = 0; 
    if(int.TryParse(userSpecifier, out userId)) 
    { 
     //It is an int, and userId contains the user Id, so process accordingly 
    } 
    else 
    { 
     //It is not an int, so treat userSpecifier as username and process accordingly 
    } 
    .... 

    return View(); 
} 

所以如果傳遞給「userSpecifier」輸入參數字符串可轉換爲int,那麼你可以認爲它是一個用戶名和相應的治療。如果它不能被轉換爲int,他們可以假定它是一個UserName並作出相應的反應。

當然,這個解決方案是基於這樣的假設:UserId是一個int,UserName是一個字符串,這是大多數應用程序的設置方式。

如果你想,而不是要進行這種確定路由,那麼你就必須建立兩個路由,並使用route contraints到contrain一個途徑來處理是整數的輸入參數和處理輸入參數的第二條路線那就是字符串。

+1

如果你已經閱讀過Dave A和我之間的評論,你會發現這已經被建議,並被視爲一個hacky。我意識到這些可能是唯一的兩個選項,但是想要設置沒有兩條基線的路由。另外,請不要更改標籤,除非他們明顯錯誤。我試圖忽略ASP特定的標籤,以防萬一有另一種我可以模仿的語言的解決方案。 – 2013-03-04 02:58:48

0

我想我會首先問你爲什麼需要兩者都參考?如果這是一個Web API路由(即restful),那麼通常只有一個get方法用於用戶API調用。我不是說你做的事當然是錯的!我只是問是否真的需要兩種檢索用戶的方式?

+0

我已經在我的問題中回答了原因。我想要一個易變的路徑(用戶名是可變的),並且一個路徑永遠不會改變(用戶標識符是不可變的)。這爲易於記憶的路徑提供了第一個選擇,而第二個選項則確保了所有時間的保證 – 2013-03-11 18:50:20