2014-02-19 121 views
5

我有以下控制器和路線定義MVC 5路由和可選參數

[System.Web.Mvc.Route("users/{firstName?}/{lastName?}/{emailAddress?}/{pageSize:int=10}/{pageNumber:int=1}", Name = RouteNames.User_Listing)] 
public ActionResult Index(string firstName = null, string lastName = null, string emailAddress = null, int pageNumber = 1, int pageSize = 10) 

我想爲任何這些不確定或定義,因此所有這些將是有效的

users/first/last/email 
users/last/email/30/2 
users/last/1 
users 

問題是,MVC如何知道哪些參數已被指定?它不!

當我有這個鏈接

@Html.RouteLink("Maintain Users", RouteNames.User_Listing) 

它並不導航到該操作方法。我該怎麼辦?

回答

8

你說得對,MVC將不知道是哪一個(除了最左邊的參數是「最需要的」。這就是說,你可以不首先指定{firstName?}/{lastName?}/指定{email}

其他

但是,您可以將它綁定爲匹配不同的格式,但請記住第一次匹配 MVC發現它將運行(並且如果這意味着將emailAddress放在firstName字段中,它將會(儘管您可以還要添加一個電子郵件約束條件,使其與參數*@*.*(或某些傳真)相匹配以避免出現這種情況。)

我要麼重新評估你想要的路線,要麼考慮將基本信息放入url(分頁),並將可選參數保存爲查詢字符串值。例如

users/30/2?firstName=___&lastName=___ 
users/30/2?emailAddress=___&lastName=___ 
users/30/2?firstName=___&emailAddress=____&lastName=___ 
4

你只需要爲這個動作指定多個屬性:

[Route("users/{firstName?}")] 
[Route("users/{firstName}/{lastName?}")] 
[Route("users/{firstName}/{lastName}/{emailAddress?}")] 
... 
+0

這實際上是因爲他希望能夠指定「... /用戶/史密斯」,並有路由弄清楚,它需要設置沒有做任何事情來解決OP的問題「firstName」等於null並且設置「lastName」等於「Smith」。正如Brad在他的回答中指出的那樣,你不能通過路由來實現。 –

+0

也許你是對的 - 我多次重讀這個問題,這不是很清楚 –

2

只需添加來傳遞參數

[Route("~/Splash/MerchantSetup/{id?}")] 
public ActionResult MerchantSetup(int? id) 
     { 
      // your code 
     }