使用jQuery 3.2.1与.NET 4.5.2 MVC时,Ajax调用控制器未返回statusText
解决jQuery Ajax获取MVC控制器返回的statusText问题
我来帮你搞定这个问题,其实核心是要正确获取jQuery Ajax回调里的jqXHR对象,同时确保后端的状态文本能正确传递到前端,具体方案如下:
1. 前端调整:在回调中获取jqXHR对象的statusText
jQuery的done和fail回调其实包含多个参数,你之前只用到了第一个参数(响应内容),但自定义的状态文本statusText需要从第三个参数jqXHR对象中获取:
成功回调(done)的修改
var promise = $.ajax({ method: 'POST', url: '/Home/TestAjaxAsync', // 补充你的其他配置:data、contentType等 }); promise.done(function(responseText, textStatus, jqXHR) { console.log("got success: "); console.log("状态文本:" + jqXHR.statusText); // 这里就能拿到你设置的"success message" console.log("响应内容:" + responseText); });
失败回调(fail)的修改
promise.fail(function(jqXHR, textStatus, errorThrown) { console.log("请求失败:"); console.log("状态码:" + jqXHR.status); // 输出400 console.log("状态文本:" + jqXHR.statusText); // 这里就能拿到你设置的"failure message" });
2. 后端配置:确保状态文本不被IIS覆盖
有时候IIS的自定义错误机制会替换你的自定义状态文本,导致前端拿到的是默认提示(比如"Bad Request"而不是你写的"failure message")。这时候需要在项目的web.config中添加配置,让服务器传递原始响应:
在<system.webServer>节点下加入:
<httpErrors existingResponse="PassThrough" />
这个配置会告诉IIS不要替换自定义的HTTP状态响应,完整保留你在HttpStatusCodeResult中设置的状态文本。
3. 可选方案:用JsonResult返回状态信息(更灵活的数据传递)
如果除了状态文本还需要返回更多业务数据,也可以换成返回JsonResult,同时手动设置响应状态码:
后端控制器代码
public ActionResult TestAjaxAsync() { try { // 执行你的业务逻辑 Response.StatusCode = 200; return Json(new { message = "success message" }, JsonRequestBehavior.AllowGet); } catch { Response.StatusCode = 400; return Json(new { message = "failure message" }, JsonRequestBehavior.AllowGet); } }
前端对应处理
promise.done(function(result) { console.log("成功消息:" + result.message); }).fail(function(jqXHR) { var result = JSON.parse(jqXHR.responseText); console.log("失败消息:" + result.message); });
这样既可以拿到自定义消息,也能保留基于状态码的判断逻辑。
内容的提问来源于stack exchange,提问作者Hu Sen
相关产品推荐
相关产品推荐

