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
相关产品推荐
相关产品推荐

