Asp.net-Mvc-Routing

MVC 5 路由和可選參數

  • June 16, 2017

我有以下控制器和路由定義

[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)

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

你是對的,MVC 不會知道哪個(除了最左邊的參數是“最需要的”)。也就是說,你不能在{email}沒有先指定的情況下指定{firstName?}/{lastName?}/.

但是,您可以將其綁定以匹配不同的格式,但請記住,第一個匹配MVC 發現它將執行(如果這意味著emailAddressfirstName它的參數匹配*@*.*(或一些傳真)以避免這種情況)。

我會重新評估您希望路由的方式,或者考慮將基本資訊放入 url(分頁),並將可選參數保留為查詢字元串值。例如

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

您只需要為此操作指定多個屬性:

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

引用自:https://stackoverflow.com/questions/21880404