我有ASP Core 2.2应用程序。我定义了控制器:
using Microsoft.AspNetCore.Mvc;
namespace Web.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
return Ok();
}
[HttpGet("{id}")]
public IActionResult GetById(int id)
{
return Ok();
}
}
}
当我使用网址/api/users/3
请求时,一切正常,将调用方法GetById
。但是,如果我尝试请求/api/users?id=3
方法,就会调用Get
方法,而我不知道该如何解决。此外,我想创建两个仅参数名称不同的相似方法。例如public IActionResult GetById(int id)
和public IActionResult GetByAge(int age)
,因此如果可能,我需要通过命名参数进行严格路由。我不想自己实现自定义中间件来解析路由,我想尝试为此找到ASP功能。
答案 0 :(得分:0)
如果要使用查询字符串,则必须在Get方法中将其作为参数接收。如果您认为查询参数以后会增加,则可以定义参数类。如下
public class UserRequest
{
public int? Age {get; set;}
public int? Id {get; set;}
}
[HttpGet]
public IActionResult Get([FromQuery]UserRequest req)
{
if(req.Id.HasValue){
// call service that can return user based on id
}
if(req.Age.HasValue){
// call service that can return user based on age
}
}
答案 1 :(得分:0)
URL /api/users/3
:“ 3”用作路由值的一部分。
网址/api/users?id=3
:“ 3”用作网址中的查询字符串。
具有Http[Verb]
个属性的属性路由是其值的一部分,它是路由值的一部分
您可以更改控制器上方的Route属性,以指定操作名称,如下所示:
[Route("api/[controller]/[action]")]
[ApiController]
public class UsersController : ControllerBase
{
// Get api/users/get
[HttpGet]
public IActionResult Get()
{
return Ok();
}
//Get api/users/GetById/3
[HttpGet("{id}")]
public IActionResult GetById(int id)
{
return Ok();
}
}