2014-09-23 49 views
-3

我將C#List<string>發送到AJAX JSON方法。但是我怎樣才能迭代這個JSON數組?通過列表中的JSON數組循環播放<string>

[WebMethod] 
    public static List<string> GetPreviousSaltsAndHashes(string name) 
    { 
     List<string> prevSalts = new List<string>(); 
     .... 
     ....    
      conn.Open(); 
      SqlDataReader reader = cmd.ExecuteReader(); 



      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       {      
        prevSalts.Add(reader.GetString(0)); 
       } 

      } 

      conn.Close();    


     return prevSalts; 
    } 


$.ajax({ 
      type: 'POST', 
      contentType: "application/json; charset=utf-8", 
      url: 'NewPassword.aspx/GetPreviousSaltsAndHashes', 
      data: "{'name':'" + username + "'}", 
      dataType: "json", 
      success: function (data) { 
       PreviousSalts = data.d; 
       alert(PreviousSalts); 
      }, 
      error: function (xhr, status, error) { 
       var exception = JSON.parse(xhr.responseText);     
       alert(exception.Message); 
      } 
     }); 

//below part is not working. What is the way to iterate? 
$.each(PreviousSalts, function (index, PreviousSalt) { 
       console.log(PreviousSalt); 
       pass = $('#txtNewPass1').val(); 
       var combo = pass + PreviousSalt; 
       var hash = new String(CryptoJS.SHA3(combo, { outputLength: 512 })); 

       if (hash == newhash) { 
        alert("matched"); 
        return false; 
       } 
      }); 
+2

描述「不工作」。你是否收到錯誤信息? 'console.log(PreviousSalt);'說了些什麼,以及你期望它說什麼?接收到的JSON是什麼樣的?你需要更具體的問題,以便我們可以幫助你! – mason 2014-09-23 20:01:33

+0

您必須在ajax回調中完成所有工作。當執行達到'$ .each'調用時,'PreviousSalts'還沒有被AJAX請求的結果填充。看到[這個問題](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call)瞭解更多信息。 – 2014-09-23 20:08:33

回答

1

如果可能,您應該切換到Web API。 ASMX正在被逐步淘汰,並且對JSON支持很差。我已經能夠迫使ASMX返回JSON這樣的:

[WebMethod] 
public static void GetPreviousSaltsAndHashes(string name) 
{ 
    List<string> prevSalts= //blah blah, retrieve data 
    HttpContext.Current.Response.ContentType="application/json"; 
    HttpContext.Current.Response.Write(JsonConvert.SerializeObject(prevSalts)); 
} 

很明顯,你失去了內容協商和您正在使用過時的技術。您應該切換到Web API。實際上,代碼大體上與您發佈的代碼相同。你只需要修理路線。

您的JavaScript永遠不會與任何數據到達$.each行。這是因爲jQuery AJAX默認是異步的。它會在收到響應後調用成功函數。因此,將該代碼放入函數中,並告訴jQuery的成功處理函數調用哪個函數。

$.ajax({ 
     type: 'POST', 
     contentType: "application/json; charset=utf-8", 
     url: 'NewPassword.aspx/GetPreviousSaltsAndHashes', 
     data: "{'name':'" + username + "'}", 
     dataType: "json", 
     success: function (data) { 
      PreviousSalts = data.d;    
      alert(PreviousSalts); 
      HandleResponse(PreviousSalts); 
     }, 
     error: function (xhr, status, error) { 
      var exception = JSON.parse(xhr.responseText);     
      alert(exception.Message); 
     } 
    }); 

function HandleResponse(PreviousSalts){ 
$.each(PreviousSalts, function (index, PreviousSalt) { 
      console.log(PreviousSalt); 
      pass = $('#txtNewPass1').val(); 
      var combo = pass + PreviousSalt; 
      var hash = new String(CryptoJS.SHA3(combo, { outputLength: 512 })); 

      if (hash == newhash) { 
       alert("matched"); 
       return false; 
      } 
     }); 
} 
0

首先,您需要將您的列表序列化爲JSON。 JSON只是數據的JavaScript字符串表示形式。 .NET提供了簡單的功能來實現這一點。下面是與偉大的信息後:

Serializing a list to JSON

其次,除非。每個代碼片段被正確嵌入已經回調,你需要調用的代碼從您的AJAX請求的成功方法。