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

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");
}

解决方案

问题根源

  1. 最初用FormData时参数为空:Controller方法参数名是aString,但FormData里的键是ids,参数名不匹配导致绑定失败。
  2. 直接传字符串触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:57:15