2016-07-12 28 views
3

我有一个带有路由参数的web api终点。它可以使用或不使用路由参数类型。我只想知道为什么在下面的代码中指定它?为什么在web api中指定路由参数类型?

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

这段代码[Route("{myId:int}")]。为什么指定int?这个[FromUri] int myId已经有一个int了。路线不会是多余的?这有什么理由吗?

回答

9

请看下面的例子:

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

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

在这里,如果URI的“ID”段是一个整数第一路由将仅被选择。否则,将选择第二条路线。


所以在你的情况下,它不是必需的。但如果您需要更智能的路由解决方案,那将是必要的。您可以使用许多不同的约束条件。例如{x:minlength(10)} - 串的10 {x:max(10)}分钟长度 - 匹配与10 {x:regex(^\d{3}-\d{3}-\d{4}$)}的最大值的整数 - 可以找到在documentation所有可用的约束正则表达式约束等

+1

其实并不完全。您需要指定'Order'属性('[Route(“users/{id:int}”,Order = 0)]'[Route(“users/{name}”,Order = 1)]') 。 .NET反射在读取属性时并不保证顺序,因此它们可能以错误的顺序输入到路由表中(随机,并且在不同的编译时可能会有所不同)。在这种情况下,需要首先执行带约束的路由。 – NightOwl888

+1

哇。我今天学了些新东西。这非常优雅。现在我要回去改变我的一些终点来遵守这一点。 – Luke101