【问题标题】:Asp.net Core 3.1 Binding: Action with a Dictionary as parameter in GETAsp.net Core 3.1 绑定:以字典作为 GET 参数的操作
【发布时间】:2021-10-26 10:53:59
【问题描述】:

我们正在定义一个用于搜索存储在存储库中的文档的操作;该界面允许指定过滤器列表以缩小结果范围。

[Route("search")]
        [HttpGet]
        [ProducesResponseType(typeof(List<DocumentDto>), (int)HttpStatusCode.OK)]
        public async Task<ActionResult<DocumentDto>> GetDocuments(
        [FromServices] IDocumentManager documentManager,
        [FromQuery] Dictionary<string, string> filters)
        {
            //Do something
        }

我们在动作签名中使用Dictionary&lt;string, string&gt; filters 之类的参数,因为我们希望使用 GET 方法但使用动态参数列表来实现搜索。
过滤器只是key:value 对象的列表,操作将传递给数据库,这是唯一知道如何处理它们的层。
我们使用调用这样的 url 的服务:

  /search?filter1=value1&filter2=value2&filter3=value3

绑定似乎“有效”,filters 填充了如下内容:

filters
[0] {[filter1, value1]}
[1] {[filter2, value2]}
[2] {[filter3, value3]}

查看与Dictionaries相关的binding chapter,似乎我们正在做的查询字符串中传递的参数没有记录。

我们是否看到了绑定的副作用?
我们用于将过滤器从查询字符串传递到字典的语法是否受支持?

【问题讨论】:

  • 这似乎有点问题 - 绑定应该是关于使事物具有强类型以及您要求它丢弃它的字典。
  • @DanielA.White 我同意,但支持字典绑定。

标签: c# .net asp.net-core action


【解决方案1】:

使用这样的绑定或多或少有点问题。控制器上的字典正在捕获所有查询参数,例如,如果您的查询字符串是:

/search?filter1=value1&filter2=value2&filter3=value3&random=randomValue

你会在字典里看到:

filters
[0] {[filter1, value1]}
[1] {[filter2, value2]}
[2] {[filter3, value3]}
[3] {[random, randomValue]}

当 ASP.NET Core 为参数创建模型绑定上下文时,模型名称comes from one of the sources

  1. 显式名称(如[FromQuery(Name = ...)]
  2. 来自价值提供者(在本例中为QueryStringValueProvider

在您的示例中,以上都不正确,因此绑定上下文中的模型名称将为空。这将导致DictionaryModelBinder 将查询字符串中的任意参数填充到字典中。

我建议根据您引用的文档修复您的查询字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多