控制器捕获异常后无法通过Ajax重定向到错误页的解决方法
解决方案:Ajax请求后实现页面重定向
问题核心:Ajax请求的响应由JavaScript接管,浏览器不会自动执行控制器返回的重定向指令,必须在前端手动处理跳转逻辑。
步骤1:修改控制器,返回包含跳转URL的JSON结果
将原来返回RedirectToActionResult的逻辑,改为返回包含跳转地址的JSON对象,让前端明确知道需要跳转的目标页面。
修改控制器方法
[HttpPost] [Authorize] public async Task<IActionResult> SaveInventorySubmittal(InventorySubmittalBE inventorySubmittal) { try { RsiAsyncResult saveResult = await _inventoryService.SaveInventorySubmittalAsync(inventorySubmittal); if (!saveResult.Succeeded) { // 生成错误页面URL并返回JSON var errorUrl = Url.Action("Message", Strings.Home, new { Heading = "Error Saving Inventory Submittal", Message = "Invalid GL Configuration", SubMessage = saveResult.GetErrorString(), Icon = "user-times" }); return Json(new { success = false, redirectUrl = errorUrl }); } Logger.LogInformation($"Inventory Submittal with UnitInventorySubmittalId: {inventorySubmittal.UnitInventorySubmittalId} saved successfully."); // 生成成功跳转的首页URL并返回JSON var indexUrl = Url.Action("Index"); return Json(new { success = true, redirectUrl = indexUrl }); } catch (Exception ex) { LogException(ex); // 生成异常对应的错误页面URL var exceptionUrl = GetExceptionRedirectUrl(ex); return Json(new { success = false, redirectUrl = exceptionUrl }); } } // 替换原RedirectToException方法,改为生成错误页面URL的私有方法 private string GetExceptionRedirectUrl(Exception exception) { RsiException rsiException = exception as RsiException; if (rsiException != null) { return Url.Action("Message", Strings.Home, new { Heading = "Error", Message = rsiException.DisplayMessage, SubMessage = ErrorSubMessage, Icon = "bomb" }); } return Url.Action("Message", Strings.Home, new { Heading = "Error", Message = "We're sorry. An unexpected error has occurred.", SubMessage = ErrorSubMessage, Icon = "bomb" }); }
步骤2:修改前端JS,处理JSON响应并触发跳转
在$.post的回调中,判断响应是否包含redirectUrl字段,若存在则通过window.location.href手动触发页面跳转。
修改前端函数
function submitInventoryModal(unitFinancialCalendarId) { const invoiceForm = $('form#submittalForm'); const formData = invoiceForm.serialize(); $.post('/Inventory/SaveInventorySubmittal', formData) .done(function (response) { // 优先处理跳转逻辑 if (response.redirectUrl) { window.location.href = response.redirectUrl; return; } // 保存成功且无需跳转时执行原有逻辑 viewSubmitConfirmation(unitFinancialCalendarId); removeNavigationModalRequirement(); }) .fail(function(xhr, status, error) { // 处理网络请求失败的极端情况,手动跳转到通用错误页 window.location.href = '/Home/Message?Heading=Error&Message=Request failed&Icon=bomb'; }); }
补充说明
- 原方案中控制器返回的
RedirectToActionResult会被Ajax接收为重定向后的页面内容(而非跳转指令),无法触发浏览器跳转; - 改用JSON返回跳转URL的方式,前后端职责清晰,前端明确知道何时需要跳转,避免耦合;
- 若必须保留控制器的重定向逻辑,可在前端判断响应的状态码或内容特征,但这种方式耦合度高,不推荐。
内容的提问来源于stack exchange,提问作者Rasik
相关产品推荐
相关产品推荐

