【问题标题】:Ajax an Array of objects to a methodAjax 一个对象数组到一个方法
【发布时间】:2019-01-22 10:48:30
【问题描述】:

我一直在尝试将此数组 ajax 到我的控制器,但是当它到达时数据被设置为 null。

我的功能:

function saveChanges() {
var grid = $("#GridName").data("kendoGrid");
var gridData = grid.dataSource.data();

var dataArray = [];

for (var i = 0; i < gridData.length; i++) {
    dataArray.push({Date: gridData[i].Date, Name: gridData[i].ProductName});
}

$.ajax({
    url: GetUrlRoot() + "Controller/Method",
    data: { gridData: dataArray },
    async: false,
    success: function () {

    },
    error: function () {

    },
    cache: false,
})

grid.saveChanges();
}

我的控制器:

public virtual string Method(List<DateName> gridData)
    {


        return string.Empty;
    }

public class DateName
{
    public DateTime Date { get; set; }
    public string Name { get; set; }
}

控制器识别出 1 条记录已发送,但该记录的值为空。

Debug.write(dataArray) 返回:

[对象对象],[对象对象]

【问题讨论】:

  • 该操作是 POST 还是 GET 操作?
  • 操作是 GET。
  • 这就是问题所在。将请求和控制器操作转换为 POST 并在请求正文中发送数据。
  • dataArray 在方法中仍然为空,我已将两者都设置为 POST。
  • 版本有很大的不同,所以我不得不对我提供的答案进行一些更改。检查更新。

标签: c# asp.net ajax asp.net-mvc-5 controller


【解决方案1】:
 data: { gridData: dataArray },

在java脚本中将匹配c#中的以下对象模型

public class GridDataObject {
    public List<DateName> gridData { get; set; }
}

然而,这与

中的参数参数不匹配
public virtual string Method(List<DateName> gridData)

首先,更新控制器操作以期望从客户端发送的所需对象模型。

控制器中的一个简单示例如下所示

[HttpPost]
public virtual string Method(GridDataObject data) {
    //...

    var gridData = data.gridData;

    //...

    return string.Empty; //strictly for demo purposes.        
}

其次,客户端需要使用正确的格式发送数据。

//...

var url = GetUrlRoot() + "Controller/Method";
var data  = { gridData: dataArray };
$.ajax({
    url: url,
    type: 'POST',
    data: data,
    async: false,
    success: function () {

    }
    error: function () {

    },
    cache: false,
});

【讨论】:

  • 谢谢!现在可行,是否有特定原因导致我的实现方式不起作用?
  • @GeorgeB 默认情况下,GET 将尝试序列化数据并将其添加到查询字符串中,这不会始终正确绑定到控制器使用的模型。通过使用匹配的数据对象发布数据,模型绑定器可以使用请求正文中发送的数据正确初始化和填充对象模型
【解决方案2】:

在您的 jQuery Ajax 部分:

将设置数据更改为:

data: JSON.stringify(dataArray),
method: 'POST', //or type:'POST' based on jQuery version
...

那么你也可以把你的控制器改成:

public virtual string Method([FromBody]DateName[] gridData){
...
}

因此,通过这些更改,$.ajax 会将 JSON 发布到您的控制器,而您的控制器将从请求正文中解析 JSON。

【讨论】:

  • 我用这个的时候,gridData进入方法时等于null。
【解决方案3】:

使用dataType: "json"traditional: true

$.ajax({
    url: GetUrlRoot() + "Controller/Method",
    data: dataArray,
    async: false,
    dataType: "json",
    traditional: true,
    success: function () {

    },
    error: function () {

    },
    cache: false,
})

【讨论】:

  • 现在它返回一个没有属性的空数组
  • 你能在for循环之后发console.log(dataArray);
  • 也可以试试data: dataArray,
  • 还是一样的结果
  • 你能发布dataArray的转储吗?
猜你喜欢
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2020-08-23
相关资源
最近更新 更多