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

ASP.NET Core POST接口通过jQuery调用时DTO接收为null,但Postman调用正常

ASP.NET Core POST接口通过jQuery调用时DTO接收为null,但Postman调用正常

我之前也碰到过几乎一模一样的问题!大概率是你的jQuery ajax请求漏了关键配置processData: false,这可是用jQuery发送预序列化JSON字符串时的经典坑。

问题根源

默认情况下,jQuery的$.ajax会把data参数当成待序列化的对象处理——哪怕你已经把数据转成了JSON字符串。它会自动对数据做URL编码,导致实际发往后端的请求体根本不是你预期的纯JSON,而是被编码后的乱码内容。ASP.NET Core的JSON解析器完全认不出这种内容,自然就把DTO的所有属性都设为null了。

你看你的ajaxCall实现里确实没加这个配置,这就是问题的核心!

修复方案

只需要在$.ajax的配置里加上processData: false就行,修改后的代码如下:

public ajaxCall(endpoint: string, method: HttpMethods, content: any, callbacks: Array<Function>, contentType) {
    var self = this;
    $.ajax({
        method: HttpMethods[method],
        url: this._contextPath + endpoint,
        contentType: contentType === ContentType.ApplicationFormUrlEncoded 
            ? "application/x-www-form-urlencoded; charset=UTF-8" 
            : "application/json; charset=utf-8",
        data: content,
        processData: false, // 新增这一行,禁止jQuery自动处理请求数据
    })
    .done(function (apiResponse, textStatus, jqXHR) {
        if(!apiResponse.success && apiResponse.metadata && apiResponse.metadata.errorId){
            self._errorObserver.errorReceived(apiResponse.metadata.message+ ":" + apiResponse.metadata.errorId)
        } else {
            for (let callback of callbacks) {
                if (callback) {
                    callback(apiResponse);
                }
            }
        }
    })
    .fail(function (msg) {
        console.log('ajax call http error: ' + msg.status + ' ' + msg.statusText);
        if (msg.status === 401) {
            document.location.href = self._contextPath;
        } else if (msg.status === 0) {
            // call aborted (page was changed?)
        } else {
            //console.log('ajax communication error: ' + msg.status + ' ' + msg.statusText);
        }
    }).always(function () {});
}

验证方法

你可以打开浏览器开发者工具的「网络」标签,对比修改前后的请求体:

  • 修改前:请求体里的双引号会变成%22,整个内容是URL编码后的格式
  • 修改后:请求体和你在Postman里发送的JSON完全一致

另外你提到其他POST接口正常,比如/api/book/property/update,大概率是那些接口的请求数据是FormData或普通对象,jQuery自动序列化后后端能正常解析,而这个接口用了预序列化的JSON字符串,才触发了这个问题。

最后再划个重点:用jQuery发送已经JSON.stringify过的字符串时,必须同时满足两个条件:

  1. contentType: "application/json; charset=utf-8"(你已经做到了)
  2. processData: false(之前漏掉的关键配置)

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:34:33