使用jQuery Ajax $.post时如何重定向至视图而非返回响应
解决AJAX提交后控制器重定向不生效的问题
这个问题的核心在于AJAX请求是异步的,浏览器不会自动处理控制器返回的重定向响应——它只会把重定向后的页面内容作为响应数据返回给JS,而不是触发页面跳转。下面给你两种常用的解决方案,你可以根据场景选择:
方案一:控制器返回重定向URL,前端手动跳转
这种方式保留AJAX提交逻辑,让控制器返回需要跳转的目标URL,然后前端JS拿到URL后主动触发页面跳转。
修改控制器代码
把原来的RedirectToAction改成返回包含重定向URL的JSON结果:
[HttpPost] public ActionResult Calculator(FormCollection data) { var report = // 从数据库获取数据的逻辑 // 生成Report页面的目标URL var redirectUrl = Url.Action("Report", report); // 返回JSON格式的重定向指令 return Json(new { redirectUrl = redirectUrl }); }
修改前端AJAX代码
在AJAX的成功回调里,拿到返回的URL后用window.location.href触发跳转:
$("#btnCalculateScore").click(function (e) { e.preventDefault(); // 阻止按钮的默认提交/刷新行为 if (validateData()) { var $frm = $("#frmCalculator"); var url = $frm.prop("action"); $.post(url, $frm.serialize(), function (response) { // 检查是否有重定向URL,存在则跳转 if (response.redirectUrl) { window.location.href = response.redirectUrl; } }); } });
方案二:验证通过后直接提交表单(放弃AJAX)
如果你的场景不需要AJAX的异步特性(比如提交后不需要在当前页做额外处理),这是最简单的方案——直接用原生表单提交,控制器的RedirectToAction就能正常触发页面跳转。
修改前端代码
去掉AJAX逻辑,验证通过后直接触发表单原生提交:
$("#btnCalculateScore").click(function (e) { e.preventDefault(); // 阻止按钮默认行为 if (validateData()) { $("#frmCalculator").submit(); // 触发表单原生提交流程 } });
控制器代码完全不用修改,保持原来的RedirectToAction逻辑即可。
方案选择建议
- 如果提交表单后需要先在当前页做一些处理(比如显示加载动画、临时提示信息)再跳转,选方案一;
- 如果只是单纯的验证后提交跳转,选方案二,代码更简洁,也避免了AJAX的额外开销。
内容的提问来源于stack exchange,提问作者55SK55
相关产品推荐
相关产品推荐

