如何将多个参数传递给ASP.NET Core中的get方法

mst*_*and 73 c# asp.net-core asp.net-core-routing

如何将多个参数传递给MVC 6控制器中的Get方法.例如,我希望能够拥有如下内容.

[Route("api/[controller]")]
public class PersonController : Controller
{
    public string Get(int id)
    {
    }

    public string Get(string firstName, string lastName)
    {

    }

    public string Get(string firstName, string lastName, string address)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以查询一下.

api/person?id=1
api/person?firstName=john&lastName=doe
api/person?firstName=john&lastName=doe&address=streetA
Run Code Online (Sandbox Code Playgroud)

小智 68

你也可以用这个:

// GET api/user/firstname/lastname/address
[HttpGet("{firstName}/{lastName}/{address}")]
public string GetQuery(string id, string firstName, string lastName, string address)
{
    return $"{firstName}:{lastName}:{address}";
}
Run Code Online (Sandbox Code Playgroud)

  • 直到你需要让每个人都使用相同的姓氏:) (17认同)
  • 那是设计API路由的一种非常糟糕的方法……根本不是RESTful的。 (6认同)
  • 上面的方法看起来很麻烦,不知道为什么有这么多的投票。 (4认同)
  • @BrunoSantos 它不遵循 REST 原则。URI 应该唯一地标识资源。这里的情况并非如此(可能有多个人具有相同的名字和姓氏,并且地址当然不能被视为标识符) (2认同)

met*_*art 42

为什么不只使用一个控制器动作?

public string Get(int? id, string firstName, string lastName, string address)
{
   if (id.HasValue)
      GetById(id);
   else if (string.IsNullOrEmpty(address))
      GetByName(firstName, lastName);
   else
      GetByNameAddress(firstName, lastName, address);
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用属性路由,但是您需要使用不同的URL格式:

//api/person/byId?id=1
[HttpGet("byId")] 
public string Get(int id)
{
}

//api/person/byName?firstName=a&lastName=b
[HttpGet("byName")]
public string Get(string firstName, string lastName, string address)
{
}
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于.net core 2.0,因为实际上没有生成有效的url模板。 (2认同)

Mar*_*hes 34

要从URL解析搜索参数,您需要使用以下方法注释控制器方法参数[FromQuery]:

[Route("api/person")]
public class PersonController : Controller
{
    [HttpGet]
    public string GetById([FromQuery]int id)
    {

    }

    [HttpGet]
    public string GetByName([FromQuery]string firstName, [FromQuery]string lastName)
    {

    }

    [HttpGet]
    public string GetByNameAndAddress([FromQuery]string firstName, [FromQuery]string lastName, [FromQuery]string address)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你为什么需要这个?默认情况下,从查询字符串进行参数绑定... (3认同)
  • @mstrand 我已经更新了 - 试一试,查看额外的 `[HttpGet]` 注释,不同的方法名称,以及 `[Route]` 中的特定路由 - 现在路由应该是完全明确的,这消除了一些可能的问题。 (2认同)

Seb*_*ian 26

我建议使用单独的 dto 对象作为参数:

[Route("api/[controller]")]
public class PersonController : Controller
{
    public string Get([FromQuery] GetPersonQueryObject request)
    {
        // Your code goes here
    }
}

public class GetPersonQueryObject 
{
    public int? Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Dotnet 会将字段映射到您的对象。

这将使传递参数变得更加容易,并且会产生更清晰的代码。

  • 那是什么意思?您可以提供值作为查询参数,例如“/api/controller?firstname={firstname}&lastname={lastname}” (3认同)

Sun*_*ule 13

我认为最简单的方法是简单地使用AttributeRouting.

[Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
    public string Get(int paramOne, int paramTwo)
    {
        return "The [Route] with multiple params worked";
    }
Run Code Online (Sandbox Code Playgroud)


Pra*_*hSE 9

在 web api core 中使用多个参数调用 get

  [ApiController]
    [Route("[controller]")]
    public class testController : Controller
    {
    
      [HttpGet]
        [Route("testaction/{id:int}/{startdate}/{enddate}")]
        public IEnumerable<classname> test_action(int id, string startdate, string enddate)
        {

            return List_classobject;
        }
    
    }

In web browser
https://Yourdomain/test/testaction/3/2010-09-30/2012-05-01
Run Code Online (Sandbox Code Playgroud)

  • @OlegIvanov 愿意分享你的答案吗?或者贡献一些有用的东西? (5认同)

Thu*_*ika 9

最简单的方法,

控制器:

[HttpGet("empId={empId}&startDate={startDate}&endDate={endDate}")]
 public IEnumerable<Validate> Get(int empId, string startDate, string endDate){}
Run Code Online (Sandbox Code Playgroud)

邮递员要求:

{router}/empId=1&startDate=2020-20-20&endDate=2020-20-20
Run Code Online (Sandbox Code Playgroud)

学习点:Controller 将接受请求的确切模式。


Pau*_* K. 6

方法应该是这样的:

[Route("api/[controller]")]
public class PersonsController : Controller
{
    [HttpGet("{id}")]
    public Person Get(int id)

    [HttpGet]
    public Person[] Get([FromQuery] string firstName, [FromQuery] string lastName, [FromQuery] string address)
}

Run Code Online (Sandbox Code Playgroud)

请注意,第二种方法返回一个对象数组,控制器名称是复数形式(Persons not Person)。

因此,如果您想通过 id 获取资源,它将是:

api/persons/1
Run Code Online (Sandbox Code Playgroud)

如果您想通过一些搜索条件(如名字等)获取对象,您可以像这样进行搜索:

api/persons?firstName=Name&...
Run Code Online (Sandbox Code Playgroud)

继续前进,如果你想接受那个人的订单(例如),它应该是这样的:

api/persons/1/orders?skip=0&take=20
Run Code Online (Sandbox Code Playgroud)

和同一个控制器中的方法:

    [HttpGet("{personId}/orders")]
    public Orders[] Get(int personId, int skip, int take, etc..)
Run Code Online (Sandbox Code Playgroud)