从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;
                }
            });

从List<;字符串>;

如果可能,您应该切换到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方法调用该代码。