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

MVC中Ajax请求返回status 0:如何实现视图数据提交至控制器

解决Ajax请求状态码0且数据无法传递的问题

这个问题我之前也碰到过,状态码0基本都是请求被页面刷新中断导致的,结合你的代码来看,主要有几个核心点需要调整:

1. 阻止表单默认提交行为

你的按钮是type="submit",点击时会触发浏览器自带的表单提交动作,页面会立即刷新,导致Ajax请求还没完成就被强制中断——这就是状态码0的根本原因。解决方法有两种:

方法A:修改按钮类型为button

<input class="btn btn-success" type="button" value="Submit" onclick="GetData();" />

方法B:在函数中手动阻止默认行为

<input class="btn btn-success" type="submit" value="Submit" onclick="return GetData();" />

然后同步修改GetData函数,添加阻止默认行为的逻辑:

function GetData(e) {
    // 阻止表单默认提交动作
    if (e) e.preventDefault();

    $.ajax({
        url: '@Url.Action("CaptureUserData","Home")',
        data: { 
            __RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val(),
            IdentityNo: "1", 
            FullName: "test",
            Dob:"12", 
            Gender: "m", 
            PhoneNo: "000", 
            PhoneNo1: "000", 
            Email: "ooo", 
            Category: "000", 
            Password: "000" 
        },
        method: 'POST',
        dataType: 'json',
        // 移除废弃的async:false,它会阻塞浏览器且已被官方标记淘汰
        success: function (response) { 
            alert('Success! Received IdentityNo: ' + response.IdentityNo); 
        },
        error: function (xhr, status, error) { 
            alert(`Error Details: Status=${xhr.status}, Message=${error}`); 
        }
    });

    return false; // 双重保险,确保默认提交被完全阻止
}

2. 添加CSRF令牌验证

ASP.NET MVC的POST请求默认要求验证AntiForgeryToken(防止跨站请求伪造攻击),如果请求不带这个令牌,控制器会直接拒绝请求,这也是数据传不过去的常见原因。

步骤1:在页面中添加令牌

在你的表单内部(或页面任意位置)插入:

@Html.AntiForgeryToken()

步骤2:给控制器方法添加验证特性

修改控制器代码,加上[ValidateAntiForgeryToken]特性:

[HttpPost]
[ValidateAntiForgeryToken] // 开启CSRF验证,确保请求合法
public ActionResult CaptureUserData(string IdentityNo, string FullName, string Dob,string Gender, string PhoneNo, string PhoneNo1, string Email, string Category, string Password )
{ 
    return Json(new { IdentityNo = IdentityNo }); 
}

3. 优化建议:用模型绑定简化参数

如果参数太多,一个个写在控制器方法里既麻烦又容易出错,建议创建一个ViewModel来统一接收数据:

创建ViewModel类

public class UserDataViewModel
{
    public string IdentityNo { get; set; }
    public string FullName { get; set; }
    public string Dob { get; set; }
    public string Gender { get; set; }
    public string PhoneNo { get; set; }
    public string PhoneNo1 { get; set; }
    public string Email { get; set; }
    public string Category { get; set; }
    public string Password { get; set; }
}

修改控制器方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CaptureUserData(UserDataViewModel model)
{ 
    // 直接使用model的属性,代码更整洁易维护
    return Json(new { IdentityNo = model.IdentityNo }); 
}

关键问题总结

  • 状态码0的核心原因:submit按钮触发了表单默认提交,中断了Ajax请求
  • 必须携带CSRF令牌才能通过ASP.NET MVC的POST请求验证
  • 废弃的async:false建议移除,它会严重影响浏览器性能和用户体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:50:45