自定义System.Text.Json JsonConverter未被MVC模型绑定器调用问题
自定义System.Text.Json转换器未被触发的常见原因
当前请求未触发JSON反序列化流程
你当前使用GET请求,参数拼接在URL的Query String中,ASP.NET Core MVC对于GET请求的复杂类型默认使用查询字符串模型绑定器绑定,该绑定器走的是TypeConverter类型转换体系,完全不会调用System.Text.Json的反序列化逻辑,自然不会触发你写的JsonConverter。
只有当请求满足以下全部条件时才会走JSON反序列化:- 请求方式为POST/PUT等支持请求体的HTTP方法
- 请求头
Content-Type设置为application/json - 待绑定的控制器参数标记了
[FromBody]特性 - 参数内容放在请求体中以JSON格式传输
代码拼写错误导致配置失效
你提供的代码存在两处拼写错误,可能导致配置不生效:- 自定义转换器继承的官方类名拼写错误:官方基类为
JsonConverter(末尾是er不是or),你代码中写的JsonConvertor属于拼写错误,会直接导致继承失效 - 视图模型
MyViewModel中的属性类型拼写错误:应该是EmployeeTypeEnum,你代码中写为EmployeTypeEnum(少了一个字母e)
- 自定义转换器继承的官方类名拼写错误:官方基类为
全局序列化配置被修改
如果你在Program.cs/Startup.cs中替换了默认的System.Text.Json序列化器,或者配置了忽略属性级JsonConverter的规则,也会导致转换器不被调用。AJAX配置错误
你提供的AJAX代码存在配置错误:$.ajax的type参数是指定请求方法,你错误的将其赋值为application/json,正确的配置应该是将contentType参数设置为application/json,如果是POST请求需要将参数放在data字段中序列化为JSON字符串传输。
对应解决方案
如果要继续使用GET请求:放弃JsonConverter的方案,自定义实现TypeConverter或者IModelBinder来处理EmployeeTypeEnum类型的查询参数转换。
如果要使用现有的JsonConverter:
- 修正所有拼写错误
- 将请求改为POST方式,把参数放在请求体中传输
- AJAX配置添加
contentType: 'application/json',参数序列化为JSON字符串传入data字段 - 控制器方法的
MyViewModel参数前添加[FromBody]特性
内容的提问来源于stack exchange,提问作者Stack Undefined
相关产品推荐
相关产品推荐

