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
相关产品推荐
相关产品推荐

