从错误响应中获取java脚本中的模型状态数据

时间:2017-01-02 02:20:27

标签: javascript angularjs asp.net-core

我在ASP.Net Core中有一个控制器动作,它返回一个具有某种模型状态的BadRequest。我想在我的Angular promise错误处理程序中将验证消息展平为单个数组。我不知道该如何去做。

这就是我在Web API控制器操作中返回BadRequest的方法。

return base.BadRequest(base.ModelState);

然后在我的Angular控制器中,我现在有一个像这样的错误处理程序。

(function () {
    angular.module('app')
        .controller('AccountCreationController', AccountCreationController);

    function AccountCreationController(AccountCreationService) {
        var viewModel = this;
        viewModel.accountSetup = AccountCreationService.getAccountTypes();
        viewModel.create = create;
        viewModel.errors = new Array();

        function create(user) {
            var result = AccountCreationService.createAccount(user).$promise.then(function (response) {
                var x = response;
            },
            function (error) {
                // iterate over each key in the key/value pair.
                for (var key in error.data) {
                    // iterate over each element in the data[key] array of validation messages
                    for (var e in error.data[key]) {
                        errors.push(e);
                    }
                }
            });
        }
    }
})();

error对象上有一个data属性,其中包含模型状态数组。该模型如下所示:

enter image description here

我可以通过在Chrome控制台中输入error.data["1"]来访问验证消息数组,然后我可以使用error.data["1"][0]获取屏幕截图中显示的消息。但是,当我尝试迭代data属性以将错误拉出到flattened数组时,该数组为空。我不确定我在这里做错了什么(JS新手) - 我在data属性中迭代每个键,然后遍历为该键保存的数组中的每个值。

为了获得基础的消息数组,我应该做些什么?

修改

如果我在Chrome控制台中运行for循环,我会得到以下输出

var errors = new Array();
for (var key in error.data) {
    for (var e in error.data[key]) {
        console.log(key + ":" + e[0]);
    }
}
  

1:0

2 个答案:

答案 0 :(得分:1)

  1. push字符串加入errors变量,但实际上您的变量定义为viewModel.errors

  2. 避免for..in循环迭代数组。有关详细信息,请参阅this answer

  3. 如果你毕竟使用for..in循环,e变量将是一个数组索引,而不是一个值。因此,如果viewModel.errors.push(error.data[key][e]);,则应使用errors.push(e)

  4. 因为你的errors数组已经是普通字符串数组,所以你可以在这里避免内部循环。只需使用viewModel.errors = viewModel.errors.concat(error.data[key])

答案 1 :(得分:-1)

使用此选项访问验证消息

error.data[1].0