POST提交的JSON对象在Web API中无法识别为object类型的求助
问题原因
报错的核心原因是JObject类型本身实现了IEnumerable<KeyValuePair<string, JToken>>接口,Dapper做参数校验时会优先检测传入对象是否为可枚举类型,误以为你要传入批量参数序列,直接触发了禁止逻辑,和参数内容本身无关。
最优解决方案
不用手动序列化参数、也不用dynamic类型接收,直接用字典类型对接前端传参,Dapper原生支持字典作为查询参数:
- 修改Web API接口签名,用
Dictionary<string, object>替代dynamic接收参数:
public async Task<IHttpActionResult> MyFunction([FromBody]Dictionary<string, object> whereCond)
- Angular端直接传原生JS对象即可,不需要包裹、也不需要手动JSON序列化:
this.migController.MigrationGetMigrationReports({NotMigrated: true, MissingTargetFiles: 0})
- 调用Dapper方法时直接传入字典即可,效果和传入匿名对象完全一致:
var result = connection.GetList<T>(whereCond);
兼容方案(需保留dynamic参数时)
如果业务逻辑要求必须用dynamic接收参数,可以手动将JObject转换为Dapper的DynamicParameters对象再传入:
string obj = whereCond.whereCond; dynamic pObj = JObject.Parse(obj); var parameters = new DynamicParameters(); foreach (var prop in pObj) { parameters.Add(prop.Key, prop.Value.Value<object>()); } var result = connection.GetList<T>(parameters);
内容的提问来源于stack exchange,提问作者joachim_b
相关产品推荐
相关产品推荐

