我当前正在创建一个新的API,但是我需要通过URL接收复杂的参数。我不能轻易更改这些参数而不会冒其他系统上的错误的风险。
我正在使用.Net Core 2.1,由于[FromUri]不存在,因此我不得不使用[FromQuery]。问题在于它不会填充复杂的参数。我知道这不是.NET Core的基本功能,但四处搜寻发现了解决方案,但似乎没有任何效果。我尝试了一个干净的项目,并且遇到了同样的问题。
使用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
我尝试过
我可以使用Request.Query自己解析所有内容,但它也认为“ foo [0] [value]”是参数键,因此我有很多可以考虑的可能性。
我敢肯定我会丢失一些显而易见的东西,但我什么都找不到。我唯一的限制是我无法触摸查询字符串格式。
答案 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。