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

标签 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 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/

相关文章:

javascript - jQuery 如何影响 mouseOver 上的单个元素

javascript - 在 IE 中隐藏 CSS 下拉菜单

javascript - 将 jQuery parseXml 限制为一定数量的循环

c# - C#中的Excel进程

javascript - 使用 JS 或 JQuery 更改 DIV 中每个元素的 CSS 位置

javascript - 如何禁用数据表中的键绑定(bind)

javascript - 调整表格的列宽

c# - 如何正确实现 IDisposable

c# - 将带有 char* 的结构编码到 C#

javascript - 循环遍历对象并替换值