ASP.NET MVC中Ajax调用后RedirectToAction未跳转问题排查
问题分析与解决
核心原因
- AJAX请求的特性限制:你用AJAX异步提交表单,服务器返回的重定向(
RedirectToAction)不会触发浏览器自动跳转。AJAX会把服务器的响应(包括重定向的状态码和目标URL)直接返回给JS的回调函数,而不是让浏览器加载新页面。 - 控制器与前端的响应不匹配:
- 最初没写
return RedirectToAction,导致代码路径没有返回值,编译报错。 - 加上
return后,控制器返回的是RedirectResult(不是JSON),前端AJAX的success回调接收到的响应里没有success字段,response.success会是undefined,所以!response.success为true,触发alert("here1")。
- 最初没写
解决方案
方案1:放弃AJAX,直接表单提交
如果不需要异步提交的需求,删掉JS里的AJAX代码,去掉return false,让表单正常提交。这样控制器的RedirectToAction就能直接触发浏览器跳转。
方案2:保留AJAX,手动处理跳转
修改控制器返回JSON数据,包含跳转URL,然后在前端JS里手动触发页面跳转:
控制器修改后代码:
[HttpPost] public ActionResult UpdateStatus(string ID) { try { // Do_Something_Here; // 返回包含成功状态和跳转URL的JSON return Json(new { success = true, redirectUrl = Url.Action("List", "Workflow", new { Id = "U" + ID }) }); } catch (Exception ex) { return Json(new { success = false, message = ex.Message, }); } }
前端JS修改后代码:
document.getElementById('newform').onsubmit = function () { var model = new FormData(); model.append("ID", '@Model.ID'); $.ajax({ url: "/Workflow/UpdateStatus", type: "POST", data: model, contentType: false, processData: false, success: function (response) { if(!response.success) { alert("here1"); } else { // 手动跳转到目标页面 window.location.href = response.redirectUrl; } }, error: function (xhr, error, thrown) { alert("here2" + xhr.responseText); } }); return false; }
内容的提问来源于stack exchange,提问作者Frank Martin
相关产品推荐
相关产品推荐

