【问题标题】:AngularJS & Ajax post - how to get ajax error (instead of success) callback to fireAngularJS 和 Ajax 帖子 - 如何让 ajax 错误(而不是成功)回调触发
【发布时间】:2015-01-12 09:26:17
【问题描述】:

我是 ajax 的新手,所以请原谅我的无知。

在 AngularJs 中,我发布了一个 ajax 帖子,如下所示:

            $.ajax({
                url: "http://localhost:65337/api/Account/Register",
                type: "POST",
                beforeSend: function (request) {
                    request.setRequestHeader("Authorization", "Bearer " + $scope.authToken);
                    request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
                },
                datatype: "json",
                data: JSON.stringify(postObj)
            }).error(function (data, status, error) {
                $scope.$emit('MESSAGE', data.Message, data.IsError);
            }).success(function (xmlHttpRequest, status, error) {
                // this callback fires even on server error code 500
            })

并且我尝试在我的服务器上遇到内部错误时触发上述错误回调,当服务器遇到错误时,我发送以下响应:

        var response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
        ErrorTModel data = new ErrorTModel(msg, IsError);

        response.Content = new StringContent(
            JsonConvert.SerializeObject(data,
            Formatting.Indented,
            new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }),
            Encoding.UTF8,
            "application/json"
            );

        return response;

我已经阅读了我在谷歌上可以找到的关于这个问题的所有内容,因此我们将不胜感激。

【问题讨论】:

  • 强烈建议不要将 jQuery ajax api 与 angular 混合使用。你真的只想在 Angular 应用程序中使用 jQuery 来处理 Angular 不支持的事情
  • 你必须抛出 HTTP 错误代码。 stackoverflow.com/questions/4495961/…
  • @charlietfl 感谢您的提醒,经过一番研究,您指的是 $http 而不是 $ajax 吗?
  • @OverMars 是的。当您使用 Angular 之外的代码来执行修改范围的操作时,您必须每次都通知 Angular。当 Angular 已有设施时,更难测试并且没有意义
  • 开始重构,谢谢!

标签: jquery ajax angularjs asp.net-web-api http-post


【解决方案1】:

我不确定你想用 c# 代码实现什么。触发错误回调(出于测试目的)的最简单方法是在您的 c# 代码中抛出异常:

throw new Exception();

【讨论】:

    【解决方案2】:

    代替

    return new HttpResponseMessage(HttpStatusCode.InternalServerError);
    

    创建并返回以下内容:

    return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new Exception("Test"));
    

    并且任何 $Ajax 或 $http 方法的 .error 回调都会触发。

    【讨论】:

      【解决方案3】:

      在发布的数据中省略一个必需的键/值对,参考 javascript 第 9 行的postObj。我会假设在发布到帐户注册端点时需要全部或部分它。

      【讨论】:

      • 您能否发布一些示例代码来说明您的意思? OP 不应该在他/她的POST 中包含哪些数据? OP如何触发error回调?在这种情况下,用解释性代码回答有助于了解哪里出错了。
      • 我指的是第 9 行的 postObj 变量,它是发布到 /api/Account/Register 的数据。我不确定该对象包含什么,但我假设它具有用于注册帐户的名称、密码或其他一些数据,并且我认为对象中至少需要一个键/值对。所以留下一个。
      • 这要么拒绝我对服务器的调用,要么在服务器端抛出错误,我正试图扭转流程。当服务器端抛出错误时,我想将该消息转发给用户。
      • 也许是 Wayne Ellery 建议的,throw new Exception(); 在 c# 代码中。我们在工作中使用 Django Rest Framework/angular,并且在 DRF 视图集中引发异常会触发失败回调(我们通常使用 angular 的$resource),这就是我建议我这样做的原因。在我的情况下工作。 :-) 祝你好运
      • Thnx @RachelHathaway,你的建议帮助我找到了我需要的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多