为什么在web api中指定路由参数类型?

Luk*_*101 8 c# asp.net-mvc asp.net-web-api

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

[HttpGet]
[Route("{myId:int}")]
public HttpResponseMessage GetData([FromUri] int myId)
{
    //code here
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*rei 19

请看这个例子:

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

[Route("users/{name}"]
public User GetUserByName(string name) { ... }
Run Code Online (Sandbox Code Playgroud)

这里,只有在URI的"id"段是整数时才会选择第一个路径.否则,将选择第二条路线.


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

您可以在文档中找到所有可用的约束.

  • 实际上,并不完全.你需要指定`Order`属性(`[Route("users/{id:int}",Order = 0)]`和`[Route("users/{name}",Order = 1)]`) ..NET Reflection在读取属性时不保证顺序,因此它们可能以错误的顺序输入到路由表中(随机地,并且可能在不同的编译时不同).在这种情况下,需要首先执行具有约束的路由. (6认同)
  • 哇.我今天学了些新东西.这很优雅.现在我要回去改变我的一些终点以符合这一点. (3认同)