2016-07-12 12 views
3

Ich habe einen Web-API-Endpunkt mit einem Routenparameter. Es funktioniert mit oder ohne den route-Parametertyp. Ich möchte nur wissen, warum dies im folgenden Code angeben?Warum den Typ des Routenparameters in der Web-API angeben?

[HttpGet] 
[Route("{myId:int}")] 
public HttpResponseMessage GetData([FromUri] int myId) 
{ 
    //code here 
} 

Dieser Code-Schnipsel [Route("{myId:int}")]. Warum das int angeben? Es gibt bereits einen int in dieser [FromUri] int myId. Wäre die Route nicht überflüssig? Gibt es einen Grund dafür?

Antwort

9

Bitte beachten Sie folgendes Beispiel:

[Route("users/{id:int}"] 
public User GetUserById(int id) { ... } 

[Route("users/{name}"] 
public User GetUserByName(string name) { ... } 

Hier ist die erste Route wird nur dann gewählt werden, wenn das „id“ Segment der URI eine ganze Zahl ist. Andernfalls wird die zweite Route ausgewählt.


Also in Ihrem Fall ist es nicht erforderlich. Aber wäre notwendig, wenn Sie eine intelligentere Routenauflösung benötigen. Es gibt viele verschiedene Einschränkungen, die Sie verwenden können. Zum Beispiel {x:minlength(10)} - String mit min Länge von 10 {x:max(10)} - Spiele eine ganze Zahl mit einem Maximalwert von 10. {x:regex(^\d{3}-\d{3}-\d{4}$)} - regex Einschränkungen usw.

Sie alle verfügbaren Einschränkungen in der documentation finden.

+1

Eigentlich nicht ganz. Sie müssen die 'Order'-Eigenschaft angeben ('[Route (" users/{id: int} ", Order = 0)]' und '[Route (" users/{name} ", Order = 1)]') . .NET Reflection garantiert keine Reihenfolge beim Lesen von Attributen, so dass sie in der falschen Reihenfolge in die Routentabelle eingegeben werden können (zufällig und möglicherweise bei verschiedenen Kompilierungen unterschiedlich). In diesem Fall muss die Route mit der Einschränkung zuerst ausgeführt werden. – NightOwl888

+1

Wow. Ich habe heute etwas Neues gelernt. Das ist sehr elegant. Jetzt werde ich zurückgehen und einige meiner Endpunkte ändern, um dem zu entsprechen. – Luke101

Verwandte Themen