我有点难以理解这个:
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 Controller 中。
public class Dto {
// ...
public int[] Files { get; set; }
// ...
}
它基本上转换成一个整数数组或一个空数组:
files: [1,2,3]
或
files: []
空数组有一个小问题。如果它被指定为 []
我得到没有数据项 files
包含在发布请求中。所以我不得不将它包装在 JSON.stringify()
中。
但是当我在服务器上做这样的事情时最奇怪的事情发生了:
postdata.Files.Length
我得到返回值 1(预期为零)。当我检查该值时:
postData.Files[0]
当我根本不期望有任何值时,我得到的值为 0。
任何人都可以阐明这里发生的事情吗?
最佳答案
我相信这是因为客户端和服务器端的数据映射。
在客户端:
在 http post request数据是serialized/encoded字符串并发布到服务器。现在服务器负责正确解析这些数据。
在空数组 [] 的情况下,您将发送文件 '[]'
的字符串。
您可以在浏览器调试器中检查网络负载/主体。
在服务器端:
它将被您的 .NET 服务器框架映射到接收数据类型。
在这种情况下 files:'[]'
,它可能被映射到 Files:[0]
。
这是因为特定的 JSONReader 在使用 JSON 流(例如 []
)时可能将其视为打开和关闭一个数组,因此最终将文件初始化为包含一个元素(在 c# 中默认整数成员值为 0)。
请阅读下面的链接以获得想法并根据您的服务器端使用的序列化/反序列化进一步挖掘。
Data Contract Serializer
Serialize and Deserialize JSON Data
JsonReader
关于javascript - 为什么 Array.Length = 1 当通过 ajax 将空数组传递给函数时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28212590/