从List<;字符串>;
本文关键字:字符串 gt lt List | 更新日期: 2023-09-27 18:24:03
我正在向AJAX JSON方法发送C#List<string>
。但是我如何迭代JSON数组?
[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;
}
});
如果可能,您应该切换到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
行。这是因为jQueryAJAX在默认情况下是异步的。它将在收到响应后调用success函数。因此,将代码放在一个函数中,并告诉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;
}
});
}
首先,您需要将列表序列化为JSON。JSON只是数据的JavaScript字符串表示。NET提供了实现这一点的简单函数。这里有一个帖子与伟大的信息:
将列表序列化为JSON
其次,除非.each代码片段已经正确地嵌入到回调中,否则您需要从AJAX请求的success方法调用该代码。