我在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
属性,其中包含模型状态数组。该模型如下所示:
我可以通过在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
答案 0 :(得分:1)
您push
字符串加入errors
变量,但实际上您的变量定义为viewModel.errors
。
避免for..in
循环迭代数组。有关详细信息,请参阅this answer。
如果你毕竟使用for..in
循环,e
变量将是一个数组索引,而不是一个值。因此,如果viewModel.errors.push(error.data[key][e]);
,则应使用errors.push(e)
。
因为你的errors数组已经是普通字符串数组,所以你可以在这里避免内部循环。只需使用viewModel.errors = viewModel.errors.concat(error.data[key])
。
答案 1 :(得分:-1)
使用此选项访问验证消息
error.data[1].0