2016-11-10 110 views
3

我有这样的:路由属性与查询字符串的路由时,有多种途径

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

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

他们通过提供的查询字符串如被称为Cats?catId=5

但是MVC的Web API会说你不能有多个路由是相同的(两条路由都是“猫”)

我该如何获得这个工作,以便MVC Web API将它们识别为单独的路由?是否有我可以放入Route属性的东西? ?是一个inval id字符放入路由。

+0

https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#constraints – Nkosi

回答

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

路由约束

路由约束使您可以限制路由 模板中参数的匹配方式。一般语法是“{参数:约束}”。 例如:

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

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

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

+0

这个方法意味着'用户/ 5'工作,但不是'/用户名= 5'这是我需要的 – NibblyPig

+0

在这种情况下,你将不得不将这两种方法合并成并根据填充的参数执行操作。 – Nkosi

+0

否则你需要更多地区分这两个行为,以便在路由映射中不存在冲突 – Nkosi

3

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

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

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

它是默认的字符串。没有必要把它放在'{name}' – Nkosi