【问题标题】:API HttpGet method with more than one parameters具有多个参数的 API HttpGet 方法
【发布时间】:2020-04-29 09:47:34
【问题描述】:

我需要创建一个带有两个 List 参数的 HttpGet 方法,但是我收到了这个错误:

有多个参数被指定或推断为从请求正文绑定。每个动作只能从正文绑定一个参数。检查以下参数,并使用“FromQueryAttribute”指定从查询绑定,“FromRouteAttribute”指定从路由绑定,使用“FromBodyAttribute”指定要从正文绑定的参数:

MyObject 有两个属性:

public class MyObject
{
    public int Prop1 { get; set; }
    public int Prop2 { get; set; }
}

我尝试过的抛出异常的方法

方法一

[HttpGet]
public IActionResult Get(List<MyObject> obj1, List<MyObject> obj2)

方法二

[HttpGet]
[Route("{obj1}/{obj2")]
public IActionResult Get(List<MyObject> obj1, List<MyObject> obj2)

方法三

[HttpGet("{obj1}/{obj2")]
public IActionResult Get(List<MyObject> obj1, List<MyObject> obj2)

使用FromQueryAttribute

我尝试使用:

[HttpGet]
public IActionResult Get([FromQueryAttribute] List<MyObject> obj1, [FromQueryAttribute] List<MyObject> obj2)

而且它不会抛出异常,但是我不知道如何通过查询属性传递这些参数?

提前致谢

附言我找到了How to pass multiple parameters to a get method in ASP.NET CorePass a list of complex object in query string to WEB API 线程但没有帮助我。

【问题讨论】:

    标签: asp.net-core asp.net-web-api asp.net-web-api-routing


    【解决方案1】:

    这似乎是一种有点奇怪的方式来传递这些数据(为什么不只是一长串它们都是相同的对象类型?)。话虽如此,您首先需要更正您的属性。该属性是来自“FromQueryAttribute”类的“[FromQuery]”。您在属性的实际使用中没有包含“属性”部分。

    所以控制器是:

    [HttpGet]
    public IActionResult Get([FromQuery] List<MyObject> obj1, [FromQuery] List<MyObject> obj2) {}
    

    然后你需要形成你的查询字符串参数来实际匹配这个结构。查询字符串看起来像:

    https://localhost:44315/api/test?obj1[0].Prop1=1&obj1[0].Prop2=2&obj2[0].Prop1=3&obj2[0].Prop2=4
    

    这将在 Get 方法中创建一个 obj1 参数对象,其列表中有一项,并且第一项(零索引)的 Prop1 值为 1,Prop2 值为 2。它还将创建一个 obj2 项在列表中,Prop1 值为 3,Prop2 值为 4。

    如果您希望 obj1 在列表中有第二项,则索引变为 1,您可以将其添加到查询字符串中:

    ...&obj1[1].Prop1=5&obj1[1].Prop2=6
    

    我在 ASP.Net CORE 3.1 API 上对此进行了测试,效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多