2016-11-15 45 views
1

我有一個MVC應用程序,用戶界面團隊已經要求該職位頁面的網址遵循以下格式:mydomain.com/careers/{jobTitle}/{JobCode}。我能做到的是,在職業生涯控制器是這樣的:如何處理未使用的MVC路由參數

public ActionResult Detail(string jobTitle, string jobCode) 
    { 
     var model = getModelFromDb(JobCode); 
     return View(model); 
    } 

的問題是,我們的工作代碼查找職業信息沒有標題,所以我們結束了一個未使用的參數。我不認爲這是最佳做法。特別是因爲你可以輸入任何你想要的職業頭銜,並仍然可以獲得工作細節。像這樣的網址仍然有效:mydomain.com/careers/yourmom/1234。

我想我們總是可以通過標題和代碼查找職業,但由於代碼是獨特的,這似乎毫無意義。

有沒有更好的方法來實現URL中的額外參數,並保持允許無效的作業標題放在網址中?

+1

你可以嘗試的一件事是使jobTitle可選,但這意味着將網址格式更改爲{JobCode}/{jobTitle},我想這不是一個選項? – Zippy

+1

看看這個問題和答案http://stackoverflow.com/questions/24678045/routing-optional-parameters-in-asp-net-mvc-5。可以在路由中使用可選參數 – Emil

+1

我猜你可能想要一個'slug'路由(其中只包括'jobCode'將導致一個包含'jobcode'和'jobTitle'的url)?如果是這樣,請參考[這個答案](http://stackoverflow.com/questions/30349412/how-to-implement-url-rewriting-similar-to-so/30363600#30363600) –

回答

0

我們最終什麼事做的是兩個參數傳遞給控制器​​(JOBTITLE和了jobCode),查找通過了jobCode記錄並驗證記錄的slug是否與傳入的jobTitle匹配(全部不區分大小寫)。通過這種方式,我們可以防止虛假網址返回作業詳細信息頁面,並保持UI團隊的快樂。

2

您可以創建your own custom route constraint,這將只允許匹配包含匹配作業代碼的jobtitle的路由。

您將不得不繼承IRouteConstraint接口並實施Match方法。該方法接收的參數之一是RouteValueDictionary

它是包含路由參數的鍵/值對的集合。您可以使用它們查找職位名稱,並確保其與職位代碼一致。

See this example for more info

這樣,您就能夠收到的唯一正確途徑,並拒絕不正確的路線像mydomain.com/careers/yourmom/1234