Mvc Ajax 调用控制器没有返回 statusText。

3

我正在使用版本为3.2.1的jQuery和.NET Framework 4.5.2 MVC。

我有一个jquery ajax调用MVC控制器。如果操作成功,则返回结果为:

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始终为“error”。有时,自定义消息会显示在responseText中,带有完整的HTML标记。

我也尝试了以下方法,但无法在生产服务器上使其正常工作。

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

似乎是服务器设置了“友好的错误消息”(或类似的自定义错误关闭),从而覆盖了您的状态码。请检查设置。 - Mackan
3个回答

2

通过jQuery文档

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

它是success回调选项的一个替代构造,有关实现细节,请参阅deferred.done()。

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

它是error回调选项的一种替代构造,.fail()方法取代了已弃用的.error()方法。有关实现细节,请参阅deferred.fail()。

done(function(...))的第一个参数是data,但fail(function(...))的第一个参数是jqXHR,它是浏览器本机XMLHttpRequest对象的超集。

是浏览器本地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);
});

根据你的需要选择最合适的方案。

我尝试了所有上述实现,但是我没有得到“失败消息”。相反,我总是得到状态文本:“错误”。 - Hu Sen
@HuSen 那真是不幸。 - Impulse The Fox
事实是,我在几乎所有的应用程序中都使用了这种做法,并且从未失败过......直到现在......非常奇怪。 - Hu Sen

0
将baseurl与您的Ajax url参数相结合。
var geturl = window.location;
var baseurl = geturl.protocol + "//" +geturl.host + "//" + geturl.pathname.split('/')[1];

网址:baseurl + 'controller/action'


0
尝试在失败时执行以下操作:
throw new HttpException(400, "bad request");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接