You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

控制器捕获异常后无法通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:55:12