C# 如何在.NET Core 2.1中重现复杂参数的[FromUri]行为

C# 如何在.NET Core 2.1中重现复杂参数的[FromUri]行为,c#,asp.net-core,asp.net-core-2.0,C#,Asp.net Core,Asp.net Core 2.0,我目前正在创建一个新的API,但我需要通过URL接收复杂的参数。我不能轻易地更改这些参数而不冒在其他系统上出错的风险 我使用的是.NETCore2.1,由于[FromUri]不存在,我不得不使用[FromQuery]。问题是它无法填充复杂的参数。我知道这不是.NETCore的一个基本功能,但我四处搜索,找到了解决方案,但似乎都不起作用。我尝试了一个干净的项目,但也遇到了同样的问题 示例URL: 使用Visual Studio 2017的基本核心API模板,我只更改了控制器 public clas

我目前正在创建一个新的API,但我需要通过URL接收复杂的参数。我不能轻易地更改这些参数而不冒在其他系统上出错的风险

我使用的是.NETCore2.1,由于[FromUri]不存在,我不得不使用[FromQuery]。问题是它无法填充复杂的参数。我知道这不是.NETCore的一个基本功能,但我四处搜索,找到了解决方案,但似乎都不起作用。我尝试了一个干净的项目,但也遇到了同样的问题

示例URL:

使用Visual Studio 2017的基本核心API模板,我只更改了控制器

public class FooParameter
{
    public string value { get; set; }
    public string name { get; set; }
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get([FromQuery]bool simple, [FromQuery]FooParameter[] foos)
{
    return new string[] { "value1", "value2" };
}
我试过了

  • 使用Microsoft.AspNetCore.Mvc.WebApiCompatShim:无
  • 使用自定义ModelBinder:似乎认为foo[0][value]是参数的整个键
  • 使用动态或对象作为类型:空对象
  • 减少到一级“&foo[value]=1&foo[name]=bar”(用于测试):包含null,null
我可以自己用Request.Query解析所有东西,但它也认为“foo[0][value]”是参数键,我得到了一个巨大的可能性列表


我很确定我遗漏了一些非常明显的东西,但我就是找不到任何东西。我唯一的限制是不能接触查询字符串格式。

我找到了必须强制转换参数的方法,以便正确加载HTML数组。它不是完全动态的,但它适合我的需要

您需要在FromQuery上使用Name属性才能获取对象

public class FooBar
{
    [FromQuery(Name = "[bar]")]
    public string bar { get; set; }
    [FromQuery(Name = "[id]")]
    public int id { get; set; }
}
// GET api/values
[HttpGet]
public ActionResult<FooBar> Get([FromQuery(Name = "foo")]FooBar[] foo)
{
    return foo;
}
公共类FooBar
{
[FromQuery(Name=“[bar]”)
公共字符串条{get;set;}
[FromQuery(Name=“[id]”)
公共int id{get;set;}
}
//获取api/值
[HttpGet]
公共操作结果获取([FromQuery(Name=“foo”)]FooBar[]foo)
{
返回foo;
}
这将取?foo[0][bar]=val&foo[0][id]=1&foo[1][bar]=val2&foo[1][id]=2并返回[{“bar”:“val”,“id”:1},{“bar”:“val2”,“id”:2}]


您可以保留[ApiController],无需制作自定义ModelBinder。

您好,当我想发送一个列表或一个值表作为url参数时,我遇到了同样的问题。我认为它总是会产生错误。我建议将链接从以下位置转换为以下位置:“”。控制器方法可以接受此链接作为表“FooParamter[]foos”。@mehdizahrane我也这么认为,但正如我所说的,我不能在不失去理智的情况下更改URL。长话短说,我这里有一些东西,从Fortran转换成C++,用自动脚本编写,然后用一个管理C++包,然后用C语言包起来,所以只看代码就可以在一个球里滚来滚去,让人感到甜蜜的解脱。用定制的模型绑定器:它似乎认为FOO [ 0 ] [值]是正确行为参数的整个键。HTTP/HTML不知道对象、数组等,因此
foo[0][value]
。完全由服务器应用程序来解释这些键或对象结构。例如:
param=value¶m=value2¶m=value3
。这将被解释为具有3个不同值的3个参数。服务器/框架如何解释这完全取决于框架的实现。ASP.NET核心将愉快地将其绑定到
字符串[]
数组。另一端的PHP将其视为单个参数,除非您通过send
param[]=value¶m[]=value2¶m[]=value3
param[0]=value¶m[1]=value2¶m[3]=value3
,否则将只取3个值中的一个。对于HTML/HTTP,它只有3个键和3个values@Tseng因此,如果我理解正确,我的选择是:1)制作一个代理,以支持的格式重新格式化查询并将其发送到API 2)诅咒.Net内核并迁移到框架3)咬紧牙关,编写我自己的解析器以模拟正确的解释,如[FromUri]没有。为什么要覆盖默认名称,您应该能够绑定到Foo[0]。Bar@johnny5你是说像Get([FromQuery]FooBar[]foo)?它不工作,我得到一个空数组。好的,你是对的。未尝试获取([FromQuery(Name=“foo”)]FooBar[]foo)。我会更正答案的。我是说从你的querystring@johnny5我无法更改查询字符串格式。我一直坚持使用香草HTML表单的方式
public class FooBar
{
    [FromQuery(Name = "[bar]")]
    public string bar { get; set; }
    [FromQuery(Name = "[id]")]
    public int id { get; set; }
}
// GET api/values
[HttpGet]
public ActionResult<FooBar> Get([FromQuery(Name = "foo")]FooBar[] foo)
{
    return foo;
}