使用Ajax传递对象列表至Controller时接收数据为Null的问题
问题原因及解决方法
核心问题:模型绑定失败导致接收对象为Null
你的代码中存在前后端数据类型不匹配的问题,ASP.NET Core的模型绑定器无法将前端传递的JSON正确转换为后端模型,最终导致dentalCaseList为Null。具体问题点如下:
UnitType类型不匹配:前端下拉框的val()返回字符串类型值(如"1"),但后端DentalCase类的UnitType是枚举类型,默认序列化器无法直接将字符串转为枚举。Date值无效:前端传递空字符串"",后端是DateTime?类型,空字符串无法转换为可空DateTime类型,触发绑定错误。- 集合属性未初始化:
DentalCaseList的DentalCases属性没有默认初始化,可能影响绑定后的集合实例化。
解决步骤
1. 修正前端数据类型
修改JS代码,确保传递的数据类型与后端模型匹配:
$('form').submit(function (e) { e.preventDefault(); var dentalCaseList = { DentalCases: [] }; $("tr[class*=dentalCase]").each(function (index, e) { let dentalCase = { Date: null, // 改为null,而非空字符串 UnitCount: 0, UnitType: 0, Name: "", FullPath: "", }; dentalCase.Name = $(this).find(".unitName").html(), dentalCase.UnitType = parseInt($(this).find(".select-unit").val()), // 转为数字类型 dentalCase.UnitCount = parseInt($(this).find(".unitCount").html()) dentalCaseList.DentalCases.push(dentalCase); }); $.ajax({ type: "POST", url: "/DentalCase/GenerateReport", dataType: "json", data: JSON.stringify(dentalCaseList), contentType: "application/json; charset=utf-8", success: function (result) { console.log('Data received: '); console.log(result); }, error: function(xhr){ // 新增错误回调,查看绑定错误信息 console.log(xhr.responseText); } }) });
2. 初始化后端模型的集合属性
修改DentalCaseList类,确保集合属性默认初始化:
public class DentalCaseList { public List<DentalCase> DentalCases { get; set; } = new List<DentalCase>(); }
3. 可选:支持枚举字符串绑定(如果需要)
如果希望前端传递枚举名称(如"FullDesign")而非数字,可在Program.cs中配置序列化器支持字符串枚举:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); });
4. 添加模型状态检查(用于排查问题)
在Controller中添加模型状态验证,快速定位绑定错误:
[HttpPost] public JsonResult GenerateReport([FromBody] DentalCaseList dentalCaseList) { if (!ModelState.IsValid) { var errors = ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage); return Json(new { Success = false, Errors = errors }); } // 原有业务逻辑 List<DentalCase> ObjEmp = new List<DentalCase>() { new DentalCase {Name="Testing Tester",UnitCount=1,UnitType=UnitType.Default }, new DentalCase {Name="Banana",UnitCount=2,UnitType=UnitType.Default } }; return Json(ObjEmp); }
内容的提问来源于stack exchange,提问作者SpacedGano
相关产品推荐
相关产品推荐

