首页 > 解决方案 > 如何在 .NET Core 2.1 中重现复杂参数的 [FromUri] 行为

问题描述

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

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

示例 URL: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 中的基本核心 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]”是参数键,我得到了一个巨大的可能性列表来计算。

我很确定我错过了一些完全明显的东西,但我什么也找不到。我唯一的限制是我不能触摸查询字符串格式。

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

解决方案


我找到了必须转换参数的方式,以便正确加载 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。


推荐阅读