通过命名参数解析路由

时间:2019-07-31 06:11:38

标签: asp.net-core routing

我有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功能。

2 个答案:

答案 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();
    }
}

参考:https://outlook.office365.com/mapi/nspi/?MailboxId=d8fd4893-846d-41b7-a21b-d051f6ccfbdb@mfcm.onmicrosoft.com