表单正常提交成功,用jQuery Serialize/FormData提交传空对象求助
我之前也碰到过一模一样的情况——常规表单提交完全正常,但用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

