AJAX调用控制器时RedirectToAction无法重定向问题求助
问题原因
AJAX请求是异步发起的,服务器返回的重定向响应(3xx状态码)只会被AJAX接收,不会自动触发浏览器页面跳转——这是AJAX的设计逻辑:它仅负责获取响应数据,而非控制页面导航。这就是为什么控制台和网络面板无报错,但页面没跳转的核心原因。
解决方案
方案一:控制器返回JSON,前端手动处理跳转
修改控制器,返回包含目标跳转URL的JSON数据,前端在AJAX成功回调中执行页面跳转:
控制器代码修改
[AllowAnonymous] [HttpPost] public ActionResult CancelAction(string cancelUrl) { var isDevEnv = ConfigurationManager.AppSettings["IsDevEnvironment"]; string redirectUrl; if (isDevEnv != null && isDevEnv.ToLower() == "true") { redirectUrl = Url.Action("Index", "Dashboard"); } else { redirectUrl = cancelUrl; } return Json(new { redirectUrl = redirectUrl }); }
前端AJAX修改
添加成功回调,接收返回的URL并跳转:
function callCancelMethod(data) { $.ajax({ type: "POST", url: "/Account/CancelAction", data: { ...data, __RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val() // 补充防伪令牌,避免CSRF错误 }, success: function(response) { if (response.redirectUrl) { window.location.href = response.redirectUrl; } }, error: function (xhr, status, error) { console.error("Error while making AJAX POST request: " + error); } }); } $("#cancelButton").on("click", function () { callCancelMethod({ cancelUrl: cancelUrl }); });
页面需添加防伪令牌(在表单外或任意位置):
@Html.AntiForgeryToken()
方案二:改用表单提交(无需AJAX)
如果不需要异步处理逻辑,直接用表单提交更简单,浏览器会自动处理服务器返回的重定向:
页面添加隐藏表单
<form id="cancelForm" action="/Account/CancelAction" method="POST"> @Html.AntiForgeryToken() <input type="hidden" id="cancelUrlInput" name="cancelUrl" value="" /> </form>
修改按钮点击事件
$("#cancelButton").on("click", function () { $("#cancelUrlInput").val(cancelUrl); $("#cancelForm").submit(); });
控制器代码无需修改,保持原重定向逻辑即可。
内容的提问来源于stack exchange,提问作者Dario Lucić
相关产品推荐
相关产品推荐

