2017-01-02 79 views
0

我在ASP.Net Core中有一個控制器操作,它返回一個BadRequest以及某些模型狀態。我想在我的Angular promise錯誤處理程序中將驗證消息平鋪到單個數組中。我不知道如何去做。從錯誤響應中獲取Java腳本中的狀態數據

這就是我在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

我可以通過鍵入error.data["1"]到Chrome的控制檯可以訪問驗證消息的數組,我可以在截圖與error.data["1"][0]顯示的消息。但是,當我嘗試迭代data屬性以將錯誤提取到展平數組中時,該數組爲空。我不確定我在這裏做了什麼錯誤(JS的新功能) - 我遍歷了data屬性中的每個鍵,然後遍歷數組中爲該鍵保存的每個值。

爲了獲得底層的消息數組,我該怎麼做?

編輯

如果我運行在Chrome的控制檯循環,我得到下面的輸出

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

[避免](http://stackoverflow.com/a/3010848/758991)迭代數組的'for..in'。你也不能在這裏迭代。只需使用'errors = errors.concat(error.data [key])' – djxak

+0

有一個類似的問題給你在這裏http:// stackoverflow。com/questions/33545909/displays-invalid-modelstate-in-web-api-via-jquery-ajax唯一的區別是我正在使用knockout而不是角度 –

+0

@djxak像'for(var key in error.data){viewModel。 errors.concat(error.data [key])}'?這不會產生任何值的數組。我做錯了嗎? –

回答

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. 因爲你的錯誤數組已經是普通字符串數組,所以你可以在這裏避免內部循環。只需使用viewModel.errors = viewModel.errors.concat(error.data[key])即可。

+0

這很好!還要感謝我對「e」的使用進行了更正。我沒有意識到這是給我一個索引 - 現在看來,這是有道理的。 –

-1

使用此訪問驗證信息

error.data[1].0 
+0

但我該如何遞歸執行?我想採取所有驗證信息並將它們填入一個數組中。每個鍵/值對代表一組消息。正如我的OP所述,我可以像控制檯一樣直接訪問它們。我的foreach循環雖然沒有預期的結果 –

+0

確定解決你的問題後,我會更新答案..重點是我需要看到數據綁定到每個錯誤的對象。 – Aravind

+0

下來選民敢於評論 – Aravind