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

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...