c# – Web API 2 / MVC 5:属性路由将参数作为查询字符串传递,以在同一控制器上定位不同的操作

前端之家收集整理的这篇文章主要介绍了c# – Web API 2 / MVC 5:属性路由将参数作为查询字符串传递,以在同一控制器上定位不同的操作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在玩新的Web API 2(这看起来非常有前途的btw),但是我有点头疼让一些路由工作.
当我有GetAllUsers / GetUser(int id)时,所有的工作都很好,但是当我添加GetUserByName(string name)和/或GetUserByUsername(string username)时,事情开始令人毛骨悚然.我知道int将是第一个,并且我可以重新排列路由,但是让我们想象下面的情况:

用户可以拥有一个有效的用户名= 1234或者名称= 1234(我知道这不太可能,但是我们需要防止任何可能的情况),我们可能在数据库中有一个有效的1234 ID,所有的路由将被混合.

也许这是我们需要处理的新的WebAPI 2,所以我想我可以带来一个“解决方法”,通过过滤器作为查询字符串来定位同一个控制器中的不同操作,如api / users /?username = 1234 (GetUserByUsername)或api / users /?name = 1234(GetUserByName)

但是我无法使查询字符串进入…实际上,GetAllUsers抓到上面的任何querystring选项.

有没有人有任何建议/修复这种情况?

非常感谢

解决方法

您需要定义方法访问名称
[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

要么

[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

更新
以上两者都可以很好地与其他路由前缀配置工作.

要么

[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

猜你在找的C#相关文章