通过Ajax向Controller传递对象时接收为null的问题排查
Ajax传递对象至Controller时接收为null的问题
问题详情
尝试通过Ajax向Controller传递对象,但调试时发现接收的filtro对象为null,多种尝试后仍未解决。
现有代码
Ajax代码
function filtro() { var nome = document.getElementById("nome").value; var idade = document.getElementById("idade").value; var dataCriacao = document.getElementById("data-criacao").value; var dataInicio = document.getElementById("data-inicio").value; var dataFim = document.getElementById("data-fim").value; var tipo = document.getElementById("tipo").value; var ativo = document.getElementById("ativo").checked; var filtro = { IdadeText: idade, Nome: nome, DataDestaqueInicio: dataInicio, DataDestaqueFim: dataFim, DataAnuncioCriacao: dataCriacao, Ativo: ativo, Tipo: tipo, }; debugger $.ajax({ type: "POST", url: '@Url.Action("Anuncios", "Admin")', data: filtro, contentType: 'application/json;', success: function (result) { } }) }
Controller代码
[HttpPost] public async Task<JsonResult> Anuncios(FiltroAnuncioDTO filtro,int pg = 1) { return Json("ok"); }
问题现象
- 调试时Controller中的
filtro参数值为null - 请求的Form Data中包含了各个字段的键值对
解决方法
核心问题
你设置了contentType: 'application/json;',但直接传递了JavaScript对象,jQuery会默认将对象序列化为form-data格式,而非JSON字符串,导致Controller无法正确解析为FiltroAnuncioDTO对象。
具体修改
将JavaScript对象转为JSON字符串
修改Ajax的data参数为JSON.stringify(filtro),确保发送标准JSON格式数据:$.ajax({ type: "POST", url: '@Url.Action("Anuncios", "Admin")', data: JSON.stringify(filtro), // 转换为JSON字符串 contentType: 'application/json; charset=utf-8', // 补充charset,规范格式 success: function (result) { } })检查DTO类定义
确保FiltroAnuncioDTO的属性名称与前端对象完全匹配(ASP.NET Core默认不区分大小写,但保持一致更稳妥),且属性具备get和set方法:public class FiltroAnuncioDTO { public string IdadeText { get; set; } public string Nome { get; set; } public DateTime? DataDestaqueInicio { get; set; } public DateTime? DataDestaqueFim { get; set; } public DateTime? DataAnuncioCriacao { get; set; } public bool Ativo { get; set; } public string Tipo { get; set; } }日期格式兼容(可选)
如果前端传递的日期字符串格式不符合.NET默认解析规则,建议将日期转为ISO格式(如yyyy-MM-dd或YYYY-MM-DDTHH:mm:ss),避免解析失败。
内容的提问来源于stack exchange,提问作者Cesar Augusto
相关产品推荐
相关产品推荐

