MVC中JsonResult返回对象属性始终为空的问题求助
排查ASP.NET MVC JsonResult返回空属性的问题
从你给出的代码来看,返回的JsonLabModel属性为空,大概率是模型绑定失败、业务方法返回值异常或者序列化配置问题导致的,我给你梳理几个排查方向和解决思路:
一、先确认Action内部的变量是否真的有值
首先在Save Action里加断点,检查这几个关键点:
- 进入Action时,
labSaveModel的初始值是不是已经为空?如果是的话,问题出在前端AJAX的模型绑定上。 - 执行
Create或Update后,返回的labSaveModel的CreateAnother和ReturnUrl属性有没有正确赋值?如果这一步就为空,那问题出在你的Create/Update业务方法里,得先排查这两个方法的逻辑,确保它们返回的是填充了正确属性的LabSaveModel实例。 - 最后创建
JsonLabModel实例时,直接查看这个实例的两个属性值是不是已经为空?如果是的话,那就是前面的步骤没把值传过来。
二、排查前端AJAX的模型绑定问题
如果labSaveModel初始值为空,那大概率是前端发送的数据没有被MVC正确绑定:
- 检查AJAX请求的
contentType是否设置为application/json; charset=utf-8。如果你的dataToPost()返回的是JSON对象,需要用JSON.stringify()转成字符串,同时设置contentType,否则MVC的模型绑定器无法正确解析:$.ajax({ url: '@Url.Action("Save", "Labs")', type: 'POST', contentType: 'application/json; charset=utf-8', // 必须加这个 data: JSON.stringify(mappedModel.dataToPost()), // 转成JSON字符串 // ...其他配置 }); - 检查
dataToPost()返回的对象结构是否和LabSaveModel的属性完全匹配(大小写要注意,C#是 PascalCase,JS是 camelCase,MVC默认会自动映射,但如果属性名完全不对应就会绑定失败)。比如LabSaveModel有CreateAnother属性,JS里的键应该是createAnother或者CreateAnother,如果是别的名字就会绑定为空。
三、检查JsonLabModel类的定义
如果Action里JsonLabModel实例的属性是有值的,但返回后前端拿到的是空,那可能是序列化问题:
- 确保
JsonLabModel的CreateAnother和ReturnUrl是公共属性且带有getter,比如:public class JsonLabModel { public bool CreateAnother { get; set; } // 必须有getter,序列化才能读取 public string ReturnUrl { get; set; } } - 检查这两个属性有没有被加上
[JsonIgnore]特性,如果加了的话,序列化时会被忽略,返回的JSON里就没有这些属性。
四、排查MVC的JSON序列化配置
如果以上都没问题,那可能是全局的JSON序列化配置有问题:
- 检查你的MVC配置(比如
Global.asax或者Startup.cs里的配置),有没有自定义的序列化设置,比如设置了只序列化特定属性,或者忽略了空值(但这里是属性为空,不是值为空)。 - 可以尝试用
JsonConvert.SerializeObject()手动序列化JsonLabModel实例,看看结果是否正确,来排查是不是MVC内置的序列化器出了问题:var jsonStr = JsonConvert.SerializeObject(new JsonLabModel(){ CreateAnother = labSaveModel.CreateAnother, ReturnUrl = labSaveModel.ReturnUrl }); // 查看jsonStr的内容,如果是正确的,那可能是MVC的JsonResult配置问题,可以换成ContentResult返回: return Content(jsonStr, "application/json");
总结
按照这个顺序排查:先确认Action内部变量值是否正常 → 检查前端AJAX的绑定 → 检查JsonLabModel的属性定义 → 排查序列化配置,应该能找到问题所在。
内容的提问来源于stack exchange,提问作者SventoryMang
相关产品推荐
相关产品推荐

