2016-11-10 102 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