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

表单正常提交成功,用jQuery Serialize/FormData提交传空对象求助

解决FormData/Ajax提交后端接收空对象的问题

我之前也碰到过一模一样的情况——常规表单提交完全正常,但用FormData做Ajax提交时后端就拿到空对象,大概率是这几个关键问题导致的:

1. 必须添加contentType: false配置

你的Ajax代码里漏掉了这个核心设置!当使用FormData时,jQuery默认会自动把请求的contentType设为application/x-www-form-urlencoded,但FormData需要浏览器自动生成multipart/form-data类型的请求头(包含正确的boundary分隔符),所以必须手动禁用jQuery的默认行为。

修改后的Ajax代码如下:

function SubmitQuestionData() {
    debugger;
    var myform = document.getElementById("questionTempDetailsForm");
    var fd = new FormData(myform);
    var url = $("#questionTempDetailsForm").attr("action");
    $.ajax({
        url: url,
        type: "post",
        data: fd,
        dataType: "json",
        // async: false, // 注:这个属性已被废弃,建议移除或改为true
        traditional: true,
        processData: false,
        contentType: false, // 新增这一行!这是关键
        success: function (msg) {
            ShowAlertMessage(msg.ResponseText, msg.MessageClass);
            if (msg.RedirectUrl != null && msg.RedirectUrl.length > 0) {
                setTimeout(LoadPage, 1500, msg.RedirectUrl, "User");
            }
        },
        error: function (res) {
            ShowAlertMessage("an error occured..", "User");
        }
    });
    return false;
}

2. 检查表单元素name与后端模型的匹配性

看你的DropDownList代码:

@Html.DropDownList("QuestionTypeId", (List<SelectListItem>)ViewBag.QuestionType, "-- Select --", new { @id = "questionType", @name = "questionType", @class = "chosen-select form-control", onchange = @"QuestionTypeChanged(this.value);" })

这里Html.DropDownList的第一个参数是QuestionTypeId,原本会生成name="QuestionTypeId"的select元素,但你又通过new { @name = "questionType" }强制修改了name值。如果你的后端模型对应的属性名是QuestionTypeId,这个字段就无法被正确绑定,甚至可能导致整个模型绑定失败变成空对象。

解决方法:要么移除@name = "questionType",让select的name保持为QuestionTypeId;要么调整后端模型的属性名为questionType,保证前后端字段名一致。

另外也请检查其他表单元素的name(比如ShortName、questionName、chkNewLine)是否都和后端模型的属性名一一对应,这是模型绑定的基础前提。

3. 建议移除废弃的async: false

async: false已经被jQuery官方废弃,同步请求会阻塞浏览器主线程,严重影响用户体验,建议直接移除这个配置(jQuery Ajax默认就是异步请求async: true)。

按照上面的步骤调整后,后端应该就能正常接收到表单数据了。

内容的提问来源于stack exchange,提问作者Abdul Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:47:20