繁体   English   中英

将数组从JavaScript传递到Asp.net Core

[英]Passing Array from JavaScript to Asp.net Core

这是调用asp.net CustomHeatMapDate的javascript代码

$('.Date').change(function () {
    var data = [];
    console.log();
    var dateList = [{"Date":"03/23/2016"}, {"Date":"03/24/2016"}];
    $.ajax({
        async: true,
        type: "GET",
       url: "/Home/CustomHeatMapDate",
       data: { Date: dateList },
        dataType: "json",
        success: function (data) {
            console.log(data);
            for (var i = 0, len = data.length; i < len; i++) {
                pushdata(data[i]);
            }
        }
    })

这是Asp.net控制器

public IActionResult CustomHeatMapDate(Array[] Date)
{           
    return View();
}

但是日期数组为空

这里有一些问题,我将逐一介绍并解释原因以及如何解决。

第一个是要发送到控制器的数据,已经对其进行了结构化,因此结果将为{Date:[{"Date":"03/23/2016"}, {"Date":"03/24/2016"}]}看起来应该 {Date:["03/23/2016", "03/24/2016"]}那么您将发送一个平面数组,而不是对象数组。

第二个问题是控制器中的数据类型,您已将其设置为Array[]这是数组的期望值。 您应该拥有的是DateTime[] ,现在将需要一个日期(时间)数组。 这意味着您必须更改发送日期,直到2016-03-23这样它才能正确反序列化。

最后一个事实是,您以GET ,实际上并不能真正处理参数中传递的结构化数据,因为它会将所有数据都放入查询字符串中,随着日期数组的变长,您可能会面临以下风险:它变得太长了。 我建议使用POST代替,尽管如果您确实要执行GET那么正如Alexandru-Ionut Mihai所说的,在ajax属性中添加traditional:true

TL; DR客户端和服务器端的数据结构错误

将所有内容放在一起,代码应如下所示

JS

$('.Date').change(function () {
    console.log();
    var dateList = ["2016-03-23", "2016-03-24"];
    $.ajax({
        type: "POST",
        url: "/Home/CustomHeatMapDate",
        data: {
            Date: dateList
        },
        dataType: "json",
        success: function (data) {
            console.log(data);
            for (var i = 0, len = data.length; i < len; i++) {
                pushdata(data[i]);
            }
        }
    })
});

C#

public ActionResult CustomHeatMapDate(DateTime[] Date)
{
    return Ok();
}

PS无需指定async:true ,因为默认情况下,JQuery Ajax会将其设置为true。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM