c# - 如何在 .NET Core 2.1 中重现复杂参数的 [FromUri] 行为
问题描述
我目前正在创建一个新的 API,但我需要通过 URL 接收复杂的参数。我不能轻易更改这些参数而不冒其他系统出错的风险。
我正在使用 .Net Core 2.1,由于 [FromUri] 不存在,我不得不使用 [FromQuery]。问题是它不会填充复杂的参数。我知道这不是 .NET Core 的基本功能,但四处搜索我找到了解决方案,但似乎没有一个有效。我尝试了一个干净的项目并遇到了同样的问题。
使用 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.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;
}
这将需要 ?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。