10

我一直在玩新的Web API 2(它看起來很有希望btw),但我有一點點頭痛得到一些路線的工作。 所有工作正常,當我有GetAllUsers/GetUser(int id),但後來當我添加GetUserByName(字符串名稱)和/或GetUserByUsername(字符串用戶名)的東西開始令人毛骨悚然。我知道,INT將是第一個,我也可以重新排序的途徑,但讓我們想象一下以下情形:Web API 2/MVC 5:屬性路由傳遞參數作爲查詢字符串,以在同一控制器上定位不同的動作

用戶可以有一個有效的username=1234name=1234(我知道這是不可能的,但我們需要避免任何可能的情況),我們可能會在數據庫中有一個有效的1234 ID,並且所有的路由都會混淆在一起。

也許這是我們需要在新的WebAPI 2上使用的東西,所以我想我可以帶一個「解決方法」將篩選器作爲querystrings傳遞給同一控制器中的不同動作,例如api/users/?username=1234(GetUserByUsername)或api/users/?name=1234(GetUserByName)

但我不能讓querystrings來通過...實際上上面的任何querystring選項被GetAllUsers捕獲。

有沒有人有任何建議/修復該場景?

非常感謝

回答

13

您需要定義像

[HttpGet("User")] 
public async Task<UserViewModel> GetByName(string name) 
[HttpGet("User")] 
public async Task<UserViewModel> GetByUserName(string name) 

//You can access like 
//- api/Users/User?name=someneme 
//- api/Users/User?username=someneme 

OR

[HttpGet("User")] 
public async Task<UserViewModel> GetByAnyName(string name="", string username="") 
//- api/Users/User?name=someneme 
//- api/Users/User?username=someneme 
//- api/Users/User?username=someneme&name=someone 

進行更新的訪問名 以上都將路由前綴的其他配置很好地工作。

OR

[HttpGet("")] 
public async Task<UserViewModel> GetAll() 
[HttpGet("")] 
public async Task<UserViewModel> Get(int id) 
[HttpGet("")] 
public async Task<UserViewModel> GetByName(string name) 
[HttpGet("")] 
public async Task<UserViewModel> GetByUserName(string name) 

//You can access like 
//- api/Users/ 
//- api/Users/?id=123 
//- api/Users/?name=someneme 
//- api/Users/?username=someneme 
+0

好極了!現在正在工作。謝謝你...我不知道我在代碼上做了什麼錯誤:p藉此機會,使用公共異步任務獲取(int id)而不是public UserViewModel Get(int ID)?據我所知web api會在管道上使用任務。歡呼聲 – julianox

+0

可能是這個幫助... http://hanselminutes.com/327/everything-net-programmers-know-about-asynchronous-programming-is-wrong – jd4u

+0

謝謝jd4u:D我錯過了這一集,非常有幫助確實。乾杯 – julianox

相關問題