Asp.net Core 3.1 GET请求Action接收Dictionary参数是否为官方支持特性?
问题结论
你观测到的绑定效果不是模型绑定的副作用,这种将扁平查询字符串参数直接绑定到[FromQuery]标记的Dictionary<string, string>参数的语法,是ASP.NET Core官方支持的特性。
绑定逻辑说明
官方文档中示例的字典绑定通常是带参数前缀的格式,例如/search?filters[filter1]=value1,这是最常用的带明确命名空间的绑定写法。但ASP.NET Core内置的DictionaryModelBinder默认兼容无前缀的绑定逻辑,满足以下两个条件就会触发:
- 字典参数没有指定绑定前缀
- 查询字符串中的参数没有匹配到Action里其他显式定义的参数
满足条件时,所有剩余的查询键值对都会被自动填充到字典对象中。
使用建议
这种设计本身就是为了适配动态参数列表的场景,完全匹配你当前的动态搜索筛选需求,该绑定逻辑从ASP.NET Core 2.0版本开始就已经稳定存在,属于公开支持的特性,可以放心在生产环境使用。
如果需要避免其他无关参数意外进入筛选字典,可以给字典参数指定绑定前缀,示例如下:
public async Task<ActionResult<DocumentDto>> GetDocuments( [FromServices] IDocumentManager documentManager, [FromQuery(Name = "filter")] Dictionary<string, string> filters)
调整后查询参数需要写为/search?filter[filter1]=value1&filter[filter2]=value2的格式,此时只会把带filter前缀的参数填充到字典里,逻辑更严谨。
内容的提问来源于stack exchange,提问作者systempuntoout
相关产品推荐
相关产品推荐

