将int列表从JavaScript传递到C#——我得到了列表,但它是空的;表单数据是';t结构正确

本文关键字:列表 表单 数据 结构 JavaScript int | 更新日期: 2023-09-27 18:28:22

我的数组填充如下:

updateLabels: function () {
    var diagrams = _stage.diagramLayer.getChildren();
    var componentIDs = new Array();
    for (var index = 0; index < diagrams.length; index++) {
        componentIDs.push(diagrams[index].componentID);
    }
    var self = this;
    $.ajax({
        url: '../PlanView/UpdateDiagrams',
        type: 'POST',
        data: { ComponentIDs: JSON.stringify(componentIDs), RackInfo: $('#RackInfoSelect').val() },
        success: function (data) {
            console.log('success');
        },
        error: function () {
            console.log("error");
        }
    });
    },

服务器端我有这种方法:

[CompressionFilterAttribute]
public JsonResult UpdateDiagrams(List<int> componentIDs, string rackInfo)
{
    List<object> diagramInformation = new List<object>(componentIDs.Count());
}

我的数据在网络上传递:

ComponentIDs:[74,445,732,351,348,347,1123,599,600,1053,350,601,602,603,332,99,877,919,349,348,347,347,349,348]
RackInfo:Equipment Weight

我成功地获得了RackInfo,如果我将UpdateDiagrams更改为预期List<string>,那么我会得到一个包含一个项目的列表,即整个ComponentID字符串。

我在这里做错了什么?

编辑:我在MVC3下工作。当传递到我的控制器时,我应该能够利用某种自动反序列化,我只是不确定如何。

解决方案:解决方案是将我的数据对象封装在JSON.stringify中,而不仅仅是componentID。尽管我可以在服务器端获得RackInfo变量,而无需将其转换为JSON。

将int列表从JavaScript传递到C#——我得到了列表,但它是空的;表单数据是';t结构正确

如果您希望发布的数据是JSON格式,那么可以尝试这样的方法。MVC应该能够在服务器端自动取消序列化。

$.ajax({
    url: '../PlanView/UpdateDiagrams',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify({
        componentIDs: componentIDs,
        rackInfo: $('#RackInfoSelect').val()
    }),
    success: function (data) {
        console.log('success');
    },
    error: function () {
        console.log("error");
    }
});

(我目前无法测试它,但即使它不是完全没有错误,也希望它能正确运行。)

您正在发送一个包含字符串列表的字符串。当它到达服务器时,需要对字符串进行反序列化。

[CompressionFilterAttribute]
public JsonResult UpdateDiagrams(string ListcomponentIDs, string rackInfo)
{
   List<int> componentIDs = (from string s in ListcomponentIDs.Split(',')
                             select Convert.ToInt32(s)).ToList<int>();
}

我把参数改成了字符串。当您将它作为int列表时,它是一个空列表,因为您没有传递int列表。

此外,在JS中,您不需要序列化数组,只需对其调用ToString即可:

data: { ComponentIDs: componentIDs.toString() ...

这样数据就不包括括号[]。

让我知道这是怎么回事。

我还没能用ASP.NET MVC测试它,但如果你删除了JSON.stringify,一切都应该正常工作。这是没有JSON.stringify:的表单数据

  • 组件ID[]:10
  • 组件ID[]:20
  • 组件ID[]:30
  • RackInfo:设备重量

这是将数组发布到服务器的正常方式。

使用JSON.stringify:

  • 组件ID:[10,20,30]
  • RackInfo:RackInfo

对JSON.stringify的调用将数组转换为字符串"[10,20,30]",因此您将向控制器发布一个字符串。