2014-02-19 6 views
5

Ich habe folgende Controller und RoutendefinitionMVC 5 Routing und optionale Parameter

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

Was ich will, für jede von ihnen ist nicht definiert oder festgelegt werden und so alle diese wäre gültig

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

Problem ist, wie MVC wissen, welche der Parameter angegeben wurde? Es tut es nicht!

Wenn ich den Link haben

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

es navigieren nicht Methode zu dieser Aktion. Was mache ich?

Antwort

8

Du hast Recht, wird MVC weiß nicht, was man (anders als der am weitesten links stehenden Parameter der „am meisten benötigt“ wird. Das heißt, Sie ein {email}{firstName?}/{lastName?}/ Angabe ohne zuerst nicht angeben können.

Sie können jedoch binden, um verschiedene Formate zu passen, aber denken Sie daran, dass die erste Übereinstimmung MVC findet es mit (und wenn das emailAddress in das Feld firstName platzieren wird, wird es. (Obwohl Sie können Fügen Sie auch eine E-Mail-Einschränkung zu diesen Parametern hinzu, die mit *@*.* (oder einem Faksimile) übereinstimmt, um das zu vermeiden.)

Ich würde entweder neu bewerten, wie Sie die Routen haben möchten, oder die grundlegenden Informationen in die URL (Paging) einfügen und die optionalen Parameter als Abfrage-String-Werte beibehalten. z.B.

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

Sie müssen nur mehrere Attribute für diese Aktion spezifizieren:

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

Dies macht eigentlich nichts die OP Frage anzusprechen, weil er will in der Lage sein, geben „.../users/Smith“ und haben die Routing-Figur heraus, dass es zu setzen braucht "firstName" ist gleich null und setzt "lastName" gleich "Smith". Wie Brad in seiner Antwort darauf hingewiesen hat, können Sie das beim Routing nicht tun. –

+0

vielleicht hast du Recht - ich habe die Frage mehrmals gelesen, es ist nicht sehr klar –

2

Fügen Sie einfach ? zum Passieren Parameter

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