【问题标题】:Iterate returned c# serialized List<string> in jQuery在 jQuery 中迭代返回的 c# 序列化 List<string>
【发布时间】:2014-03-05 02:55:01
【问题描述】:

我有一个网络方法,它将读取 csv 文件中的第一行以获取列标题,然后将每个项目存储在列表中,我将返回到 ajax 调用。这是代码:

[WebMethod]
    public static string getAvailableSensors()
    {
        List<string> sensors = new List<string>();
        try
        {
            string path = "C:\\.....\\TestData3.csv";
            string line;
            using (StreamReader sr = new StreamReader(path))
            {
                line = sr.ReadLine();
                sensors = line.Split(',').ToList();
            }
        }
        catch (Exception ex)
        {
            string error = ex.Message;
        }
        JavaScriptSerializer jss = new JavaScriptSerializer();
        string output = jss.Serialize(sensors);
        return output;
    }

这是数据返回给 ajax 调用时的样子:

这就是我的 ajax 的样子:

$.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "WebSockets.aspx/getAvailableSensors",
            async: false,
            data: "{ }", // send an empty object for calls with no parameters
            success: function (result) {
                debugger;
                data = result.d;
                for (var i in result.d) {
                    sensors.push(result.d[i]);
                }
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert("an error has occured: " + xhr.responseText);
            }
        });

但这一次只填充数组 1 个字符,这不是我想要做的。

我不知道如何迭代该死的 json,以便我可以用这些列填充我的 var sensors = new Array();。例如(传感器[0] 应该是“时间”,传感器[1] 应该是“X Accel LH​​”)等等。

【问题讨论】:

  • 您遇到的错误是什么?
  • 没有收到错误。更像是在正确迭代返回的数据时遇到问题。我尝试过的每一个想法一次只返回一个字符

标签: c# jquery asp.net ajax json


【解决方案1】:

首先,您需要将该字符串作为对象。使用jQuery.parseJSON() 使其成为对象。

data=jQuery.parseJSON(data);

在你的情况下,你可以像字符串数组一样使用数据

【讨论】:

  • 非常感谢。您刚刚保存了一台计算机和一个窗口。我有一段时间没有这样做了,所以我忘记了 jQuery.parseJSON
【解决方案2】:

在您的 AJAX 选项中,您应该设置 dataType: 'json' 以便响应在传递给您的回调之前自动转换为 JSON。这可能是您期望 contentType 做的事情,但实际上它设置了正在发送的内容的类型,而不是您期望返回的内容。您可能还想应用 ScriptMethodAttribute 并指定返回的结果是 JSON - 我相信这将设置 Content-Type 标头,以便 jQuery 可以在您没有在选项中指定格式的情况下自动检测格式。

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string getAvailableSensors()
{
   ...
}

JavaScript

$.ajax({
    type: "POST",
    dataType: "json", // <-- this
    contentType: "application/json; charset=utf-8",
    url: "WebSockets.aspx/getAvailableSensors",
    async: false,
    data: "{ }", // send an empty object for calls with no parameters
    success: function (result) {
        debugger;
        data = result.d;
        for (var i in result.d) {
            sensors.push(result.d[i]);
        }
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert("an error has occured: " + xhr.responseText);
    }
});

如果您使用的是较新版本的 jQuery,您可能需要考虑用 donefail 方法替换成功和错误回调。

$.ajax({
        type: "POST",
        dataType: "json", // <-- this
        contentType: "application/json; charset=utf-8",
        url: "WebSockets.aspx/getAvailableSensors",
        async: false,
        data: "{ }", // send an empty object for calls with no parameters
 })
 .done(function(result) {
     debugger;
     data = result.d;
     for (var i in result.d) {
          sensors.push(result.d[i]);
     }
 })
 .fail(function(xhr, status, error) {
     alert("an error has occured: " + xhr.responseText);
 });

【讨论】:

  • 感谢您的详细回答。我一定会记住这一点以便更好地实施。
【解决方案3】:

您可以只从您的网络方法返回一个IList&lt;string&gt;,而不是手动进行序列化。

[WebMethod]
public static IList<string> getAvailableSensors()
{
    List<string> sensors = new List<string>();
    string path = "C:\\.....\\TestData3.csv";
    string line;
    using (StreamReader sr = new StreamReader(path))
    {
        line = sr.ReadLine();
        sensors = line.Split(',').ToList();
    }
    return sensors;
}

另外,您的错误处理并不完全正确。对于客户端,即使服务器端出现错误,操作也会成功。我刚刚删除了你 try catch 让异常传播到客户端。

【讨论】:

    猜你喜欢
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2017-05-29
    • 2013-01-16
    相关资源
    最近更新 更多