You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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对象。

具体修改

  1. 将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) {
        }
    })
    
  2. 检查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; }
    }
    
  3. 日期格式兼容(可选)
    如果前端传递的日期字符串格式不符合.NET默认解析规则,建议将日期转为ISO格式(如yyyy-MM-dd或YYYY-MM-DDTHH:mm:ss),避免解析失败。

内容的提问来源于stack exchange,提问作者Cesar Augusto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:30:52