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

时间:2018-07-19 13:14:38

标签: c# asp.net-core asp.net-core-2.0

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

我正在使用.Net Core 2.1,由于[FromUri]不存在,因此我不得不使用[FromQuery]。问题在于它不会填充复杂的参数。我知道这不是.NET Core的基本功能,但四处搜寻发现了解决方案,但似乎没有任何效果。我尝试了一个干净的项目,并且遇到了同样的问题。

示例网址:https://localhost:44337/api/values?simple=true&foo[0][value]=1&foo[0][name]=bar&foo[1][value]=2&foo[1][name]=ultra%20bar

使用Visual Studio 2017中的基本Core 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" };
}

结果是:

simple = True
foos = Length 0 Array of FooParameter

我尝试过

  • 使用Microsoft.AspNetCore.Mvc.WebApiCompatShim:没什么
  • 使用自定义ModelBinder:似乎认为foo [0] [value]是参数的整个键
  • 使用动态或对象作为类型:空对象
  • 改为减少“&foo [value] = 1&foo [name] = bar”(用于测试):包含null,null

我可以使用Request.Query自己解析所有内容,但它也认为“ foo [0] [value]”是参数键,因此我有很多可以考虑的可能性。

我敢肯定我会丢失一些显而易见的东西,但我什么都找不到。我唯一的限制是我无法触摸查询字符串格式。

1 个答案:

答案 0 :(得分:2)

我找到了必须强制转换参数以便正确加载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;
}

这将使用?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。