草庐IT

c# - Web API 2/MVC 5 : Attribute Routing passing parameters as querystring to target different actions on same controller

coder 2024-06-02 原文

我一直在玩新的 Web API 2(顺便说一句,它看起来很有前途),但我有点头疼要让一些路由正常工作。 当我有 GetAllUsers/GetUser(int id) 时一切正常,但是当我添加 GetUserByName(string name) 和/或 GetUserByUsername(string username) 时,事情开始变得令人毛骨悚然。我知道 int 将是第一个,我可以重新排序路由,但让我们想象一下以下场景:

用户可以有一个有效的 username=1234name=1234(我知道这不太可能,但我们需要防止任何可能的情况)并且我们可能有一个有效的1234 数据库中的 ID 和所有路由将混淆。

也许这是我们需要在新的 WebAPI 2 上使用的东西,所以我想我可以提供一个“解决方法”,将过滤器作为查询字符串传递给同一 Controller 中的不同操作,例如 api/users/?username=1234 (GetUserByUsername) 或 api/users/?name=1234 (GetUserByName)

但我无法使查询字符串通过...实际上上面的任何查询字符串选项都被 GetAllUsers 捕获。

有人对该场景有任何建议/修复吗?

非常感谢

最佳答案

你需要像这样定义方法访问名

[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# - Web API 2/MVC 5 : Attribute Routing passing parameters as querystring to target different actions on same controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19391066/

有关c# - Web API 2/MVC 5 : Attribute Routing passing parameters as querystring to target different actions on same controller的更多相关文章

随机推荐