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



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

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

示例URL:https://localhost:44337/api/values?simple=true&foo[0][value]=1&foo[0][名称]=bar&foo[1][value]=2&foo[1][name]=超%20bar

使用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" };
}

结果是:

simple = True
foos = Length 0 Array of FooParameter

我试过

  • 使用Microsoft.AspNetCore.Mvc.WebApiCompatShem:Nothing
  • 使用自定义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;
}

这需要吗?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。

最新更新