我目前正在创建一个新的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。