当存在多个路由时,使用查询字符串路由属性路由

时间:2016-11-10 11:49:27

标签: c# asp.net-web-api asp.net-web-api-routing

我有这个:

[HttpGet]
[Route("Cats")]
public IHttpActionResult GetByCatId(int catId)

[HttpGet]
[Route("Cats")]
public IHttpActionResult GetByName(string name)

通过提供查询字符串(例如Cats?catId=5

)来调用它们

然而,MVC Web API会说你不能拥有多条相同的路线(两条路线都是" Cats"。

如何让它工作,以便MVC Web API将它们识别为单独的路由?有什么东西我可以放入Route属性吗?它说?是放入路线的无效字符。

2 个答案:

答案 0 :(得分:4)

尝试在属性路由上应用约束。

[HttpGet]
[Route("Cats/{catId:int}")]
public IHttpActionResult GetByCatId(int catId)

[HttpGet]
[Route("Cats/{name}")]
public IHttpActionResult GetByName(string name)

答案 1 :(得分:3)

您可以将有问题的两个动作合并为一个

[HttpGet]
[Route("Cats")]
public IHttpActionResult GetCats(int? catId = null, string name = null) {

    if(catId.HasValue) return GetByCatId(catId.Value);

    if(!string.IsNullOrEmpty(name)) return GetByName(name);

    return GetAllCats();
}

private IHttpActionResult GetAllCats() { ... }

private IHttpActionResult GetByCatId(int catId) { ... }    

private IHttpActionResult GetByName(string name) { ... }

或者为了更灵活地尝试路线约束

引用Attribute Routing in ASP.NET Web API 2 : Route Constraints

  

路线约束

     

路径约束允许您限制路径中的参数   模板匹配。一般语法是“{parameter:constraint}”。   例如:

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

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

这里,只有在“id”段的情况下才会选择第一条路线   URI是一个整数。否则,将选择第二条路线。