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

Ajax无法捕获Controller异常返回的JSON错误消息,求解决方案

解决Ajax无法捕获Controller返回的JSON错误消息问题

问题原因

  • 控制器catch块返回的Json结果默认使用200 OK的HTTP状态码,jQuery的$.get仅在HTTP状态码为4xx/5xx时才会触发fail回调,因此错误消息会进入success回调而非fail。
  • 即使进入fail回调,jqXHR.responseText是字符串格式,直接访问response.message会得到undefined,需要先解析为JSON对象。

解决方案

步骤1:修改Controller,设置错误状态码

在catch块中设置HTTP状态码为错误类型(如500),确保Ajax触发fail回调:

public ActionResult GetTable()
{
    try
    {
        // 你的业务逻辑代码
    }
    catch (Exception ex)
    {
        // 可选:记录异常日志
        Response.StatusCode = 500; // 设置服务器错误状态码
        return Json(new { result = false, message = "İşlem başarıyla gerçekleşti ancak tablo güncellenirken bir sorun oluştu." });
    }
}

步骤2:修改JS代码,解析JSON并处理错误

在fail回调中先将responseText解析为JSON对象,再读取message;同时建议在success回调中也判断业务状态(避免非异常场景的业务失败):

function updateTable(isInsert) {
    var pageNumber = 1;
    if (isInsert) {
        pageNumber = 1;
    } else {
        pageNumber = $('#customersTable').bootstrapTable('getOptions').pageNumber;
    }
    $.get('/Customer/GetTable', function (data) {
        // 处理业务失败场景(无异常但result为false)
        if (!data.result) {
            showToast('Başarısız', data.message, false);
            return;
        }
        $('#tableContainer').html(data);
        $('#customersTable').bootstrapTable('destroy');
        $('#customersTable').bootstrapTable();
        $('#customersTable').bootstrapTable('selectPage', pageNumber);
    })
    .fail(function (jqXHR, textStatus, errorThrown) {
        try {
            // 将字符串解析为JSON对象
            var response = JSON.parse(jqXHR.responseText);
            showToast('Başarısız', response.message, false);
        } catch (parseError) {
            // 解析失败时显示默认错误
            showToast('Başarısız', 'Beklenmedik bir hata oluştu', false);
        }
    });
}

优化方案:统一返回JSON格式

如果控制器成功场景返回的是HTML,建议改为统一返回JSON,包含HTML内容和状态标识,避免数据格式混淆:

控制器代码:

public ActionResult GetTable()
{
    try
    {
        // 示例:将部分视图渲染为HTML字符串(需自行实现RenderViewToString方法)
        string tableHtml = RenderViewToString("_TablePartial", yourModel);
        return Json(new { result = true, html = tableHtml, message = "" });
    }
    catch (Exception ex)
    {
        Response.StatusCode = 500;
        return Json(new { result = false, html = "", message = "İşlem başarıyla gerçekleşti ancak tablo güncellenirken bir sorun oluştu." });
    }
}

JS代码:

function updateTable(isInsert) {
    var pageNumber = 1;
    if (isInsert) {
        pageNumber = 1;
    } else {
        pageNumber = $('#customersTable').bootstrapTable('getOptions').pageNumber;
    }
    $.get('/Customer/GetTable')
    .done(function (data) {
        if (data.result) {
            $('#tableContainer').html(data.html);
            $('#customersTable').bootstrapTable('destroy');
            $('#customersTable').bootstrapTable();
            $('#customersTable').bootstrapTable('selectPage', pageNumber);
        } else {
            showToast('Başarısız', data.message, false);
        }
    })
    .fail(function (jqXHR, textStatus, errorThrown) {
        try {
            var response = JSON.parse(jqXHR.responseText);
            showToast('Başarısız', response.message, false);
        } catch (parseError) {
            showToast('Başarısız', 'Beklenmedik bir hata oluştu', false);
        }
    });
}

内容的提问来源于stack exchange,提问作者krautcez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:53:17