You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core [FromQuery]绑定Dictionary时值为null,查询参数能否使用dynamic

核心结论

dynamic/object 类型无法直接用于ASP.NET Core的查询参数绑定,这是你字典绑定为null的核心原因,此外你的代码还有三处会导致绑定失败的细节问题。

原因拆解

1. dynamic/object的类型特性导致绑定失效

查询参数的原始格式都是字符串键值对,ASP.NET Core内置模型绑定器必须提前获知目标值的具体类型,才能完成字符串到目标类型的转换。
dynamic是运行时动态解析的语法糖,编译期没有固定的类型元数据,模型绑定器无法判断要把传入的字符串转换成哪种类型,会直接跳过绑定返回null。object同理,内置绑定器不会自动对字符串做隐式类型推断(比如不会自动把"123"转成int、"true"转成bool),只要字典值是这两种类型,自动绑定就一定会失败。

2. 字段而非属性的写法也会导致绑定失败

你定义的myDictionary是公共字段,没有get/set访问器。ASP.NET Core默认模型绑定器只会识别带公共get/set的属性,不会直接绑定字段,就算把字典改成支持的类型,当前写法也无法正常接收值。

3. 接口参数名使用保留关键字

你接口的参数名直接用了params,这是C#的保留修饰符关键字,要么加@前缀写成@params,要么改成其他参数名(比如queryParam),否则会直接触发编译错误,无法正常运行接口。

可行的解决方案

  • 如果字典值全为字符串:将字典改为Dictionary<string, string>类型的属性,写法示例:
public class MyObject {
    public Dictionary<string, string> MyDictionary { get; set; }
}

此时Postman中按?MyDictionary[键1]=值1&MyDictionary[键2]=值2的格式传参即可正常绑定。

  • 如果需要支持多类型值:放弃自动模型绑定,直接手动读取查询参数解析。可以在接口中注入IHttpContextAccessor,从Request.Query中筛选所有以MyDictionary为前缀的参数,自行判断值的类型完成转换。
  • 如果传递的结构较复杂,优先将接口改为POST,使用[FromBody]接收JSON请求体,这种场景下绑定Dictionary<string, object>是完全支持的,也能正常识别不同的JSON值类型。

内容的提问来源于stack exchange,提问作者user12557496

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 18:36:00