当空数组通过ajax传递给函数时,为什么Array.Length = 1?

时间:2015-01-29 10:40:13

标签: javascript c# jquery .net ajax

我抓住这个有点困难:

var data = {
    // ...
    files: $("#asgnNew-Popup .attachments-block").find(".file").length > 0 
        ? $("#asgnNew-Popup .attachments-block").find(".file").map(function() { 
            return $(this).attr("data-fileid"); 
        }).get() 
        : JSON.stringify([]),
        // ...
};

这是我的data参数的一部分,它与POST类型请求一起传递到C#.Net控制器。

public class Dto {
    // ...
    public int[] Files { get; set; }
    // ...
}

所有它基本上都转换为一个int数组或一个空数组:

files: [1,2,3]

files: []

空数组有点问题。如果将其指定为[],则我不会在帖子请求中包含任何数据项files。所以我必须把它包装在JSON.stringify()

但是当我在服务器上做这样的事情时,最奇怪的事情发生了:

postdata.Files.Length

我得到的值为1(期望为零)。当我检查那个值时:

postData.Files[0]

当我没想到会有任何值时,我得到的值为0.

有人可以了解这里发生的事情吗?

1 个答案:

答案 0 :(得分:1)

我认为这是因为客户端和服务器端的数据映射 在客户端:http post request中,数据为serialized/encoded以字符串并发布到服务器。现在,服务器有责任正确解析这些数据。 如果是空数组[],则发送文件'[]'的字符串 您可以在浏览器调试器中检查网络有效负载/主体。

在服务器端: 它将由.NET服务器框架映射到接收数据类型。 在这种情况下files:'[]',它可能会映射到Files:[0] 这是因为特定的 JSONReader 在使用JSON流(比如[] 可以将其视为打开和关闭数组因此最终将文件初始化为包含一个元素(c#中的默认整数成员值为0) 请阅读以下链接以获得一个想法,并根据服务器端使用的序列化/反序列化进一步挖掘。
Data Contract Serializer
Serialize and Deserialize JSON Data
JsonReader