AJAX提交HiddenField替代FormData报错500,请求技术解决方案
问题:AJAX POST提交隐藏字段值到ASP.NET MVC控制器失败
我在用AJAX向Controller发送POST请求时遇到问题:最初用FormData提交能正常调用Controller,但Controller方法的参数为空;后来尝试直接提交隐藏字段的值,请求返回500错误。
最初可调用但参数为空的AJAX代码
var path = $(this).prop("value"); var token = $('[name=__RequestVerificationToken]').val(); var headers = {}; headers["__RequestVerificationToken"] = token; var ids = $("#ids").val(); var formData = new FormData(); formData.append('ids', ids); $.ajax({ url: path, type: "POST", cache: false, headers: headers, data: formData, async: false, processData: false, contentType: false, success: function (result) { document.write(result); document.close(); console.log("YES"); }, error: function () { alert("Error."); } });
对应最初的Controller方法
[AjaxOnly] [HttpPost] [ValidateAntiForgeryToken] [OutputCache(NoStore = true, Location = OutputCacheLocation.None)] public ActionResult MyMethod(string aString)
需求与问题
我实际需要提交隐藏字段#ids的值,而非FormData或表单序列化。但直接把var aString = $("#ids").val();放到AJAX的data字段后,请求返回500错误。
视图与部分视图代码
MyForm视图
@{ ViewBag.Title = "MyForm"; @model MyFormModel } @using (Html.BeginForm("MyForm", "MyController", FormMethod.Post, new { id = "MyForm" })) { <div class="tab-content" id="tabContent"> content </div> @Html.Partial("_MyFormPopup")
_MyFormPopup部分视图
@using (Html.BeginForm("MyMethod", "MyController", FormMethod.Post)) { @Html.AntiForgeryToken() <div class="modal fade"> content </div> @Html.Hidden("ids")
最终的Controller方法
[AjaxOnly] [HttpPost] [ValidateAntiForgeryToken] [OutputCache(NoStore = true, Location = OutputCacheLocation.None)] public ActionResult MyMethod(string ids) { string[] IdsFunktions = ids.Split(new string[] { ";" }, .... return RedirectToAction("MyForm"); }
解决方案
问题根源
- 最初用FormData时参数为空:Controller方法参数名是
aString,但FormData里的键是ids,参数名不匹配导致绑定失败。 - 直接传字符串触发500错误:一是纯字符串无法被MVC默认的表单格式解析;二是防伪令牌放在headers里,
ValidateAntiForgeryToken过滤器无法识别(默认从表单字段/请求体读取)。
修正后的AJAX代码
var path = $(this).prop("value"); var token = $('[name=__RequestVerificationToken]').val(); var ids = $("#ids").val(); $.ajax({ url: path, type: "POST", cache: false, // 用键值对传参,确保参数名与Controller的ids完全匹配 data: { __RequestVerificationToken: token, ids: ids }, async: false, // 保留默认的contentType和processData,无需手动修改 success: function (result) { document.write(result); document.close(); console.log("YES"); }, error: function (xhr) { alert("Error: " + xhr.responseText); } });
额外说明
- 把防伪令牌放到
data中,而非headers,确保ValidateAntiForgeryToken能正常验证。 - 保持参数键名
ids与Controller方法的参数名一致,MVC模型绑定才能正确映射值。 - 如果
ids是分号分隔的多值字符串,Controller中的Split逻辑可正常处理,无需额外配置。
内容的提问来源于stack exchange,提问作者optPr1me
相关产品推荐
相关产品推荐

