【问题标题】:Mvc Ajax call to controller not returning statusText对控制器的 Mvc Ajax 调用不返回 statusText
【发布时间】:2023-03-16 01:27:01
【问题描述】:

我正在使用带有 .NET 框架 4.5.2 MVC 的 jquery 3.2.1。

我有一个对 mvc 控制器的 jquery ajax 调用。如果动作成功,则返回

return new HttpStatusCodeResult(200, "success message");

当它失败时,

return new HttpStatusCodeResult(400, "failure message");

这是我的 javascript 调用:

var promise = $.ajax({
    method: 'POST',
    url: '/Home/TestAjaxAsync',
    // ...
});

promise.done(function(results) {
    console.log("got success: ");
    console.log(results);
});

promise.fail(function(err) {
    console.log("got error: ");
    console.log(err);
});

所有这些都可以在 Visual Studio IIS Express 的本地机器上完美运行,并且在本地托管时。我可以发送请求并在 statusText 属性中获取带有状态码的“成功消息”和“失败消息”。

但是当远程托管在生产服务器中时,这将停止工作。我能够成功发送请求并成功接收响应并获得 200 OK 的“成功消息”。但对于 400、401、403 或任何其他错误代码,statusText 始终为“错误”。有时,自定义消息在 responseText 中显示为带有完整 html 标记的 YSOD。

我也尝试了以下方法,但根本无法在生产服务器上运行。

return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "failure message");

【问题讨论】:

  • 听起来像是 友好错误消息 的服务器设置(或类似的,自定义错误可能已关闭)正在覆盖您的状态代码。检查设置。

标签: jquery ajax asp.net-mvc


【解决方案1】:

jQuery Documentation

jqXHR.done(function(data, textStatus, jqXHR) {});

成功回调选项的替代构造,请参阅 deferred.done() 了解实现细节。

jqXHR.fail(function(jqXHR, textStatus, errorThrown) {});

错误回调选项的替代构造,.fail() 方法替换了已弃用的 .error() 方法。实现细节参考 deferred.fail()。

done(function(...))的第一个参数是data,但是fail(function(...))的第一个参数是jqXHR,这..

是浏览器原生 XMLHttpRequest 对象的超集


你应该试试

promise.fail(function (jqXHR) {
    console.log("got error: ");
    console.log(jqXHR.responseText);
});

promise.fail(function (jqXHR, textStatus) {
    console.log("got error: ");
    console.log(textStatus);
});

promise.fail(function (jqXHR, textStatus, errorThrown) {
    console.log("got error: ");
    console.log(errorThrown);
});

取决于最适合您的。

【讨论】:

  • 我尝试了上述所有实现。我没有收到“失败消息”。相反,我总是得到 statusText: "error"
  • @HuSen 那真是……不幸。
  • 事情是我在几乎所有的应用程序中都使用了这种做法并且从未失败过......直到现在......确实很奇怪
【解决方案2】:

使用您的 Ajax url 参数添加 baseurl。

var geturl = window.location;
var baseurl = geturl.protocol + "//" +geturl.host + "//" + geturl.pathname.split('/')[1];

url : baseurl + '控制器/动作'

【讨论】:

    【解决方案3】:

    失败时试试这个:

    throw new HttpException(400, "bad request");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      相关资源
      最近更新 更多