使用 AJAX 构建 JSON 集合并将其绑定到控制器操作的参数



有很多这样的问题,但我找不到我在特定情况下做错了什么。我正在尝试构建一个对象的JSON集合,并将其绑定到控制器操作的参数。

目前,我只是试图将Name属性绑定到列表。我唯一能想到的问题可能是我的JSON集合结构。

AJAX:

function GetFilteredDatatablesValues() {
var data = {
Columns: []
};
for (var i = 0; i < 5; i++) {
var column = {
Name: "name" + i
};
data.Columns.push(column);
}
data = JSON.stringify(data);
$.ajax({
url: '/Client/DatatablesSearchTest',
type: 'POST',
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: data,
error: function (response) {
},
success: function (data) {
}
});
}

控制器动作:

public JsonResult DatatablesSearchTest(List<DataTableColumn> Columns) //Columns contains 0 items
{
List<DataTableColumn> test = Columns;
return Json(new { success = true });
}

型号:

public class DataTableColumn
{
public int Data { get; set; }
public string Name { get; set; }
public bool Orderable { get; set; }
public bool Searchable { get; set; }
public Search Search { get; set; }
public DataTableColumn()
{
Search = new Search();
}
}

您发送的数据如下所示:

{
Columns: [
{ column 1 },
{ column 2 }
]
}

但控制器期望的数据看起来是这样的:

[
{ column 1 },
{ column 2 }
]

我建议您始终创建一个能够准确反映您想要发送到服务器的内容的模型。所以你的控制器动作看起来是这样的:

[HttpPost]
public JsonResult DatatablesSearchTest(SearchModel model)
{
List<DataTableColumn> test = model.Columns;
return Json(new { success = true });
}
public class SearchModel
{
List<DataTableColumn> Columns { get; set; }
}

我确认您的代码在.Net Framework中工作良好,但在.netcore:中不工作

解决问题的简单解决方案:

1:将属性List<DataTableColumn> Columns放入RootModel:

public class RootModel
{
public List<DataTableColumn> Columns { get; set; }
}

2:通过像参数一样添加[FromBody]RootModel rootModel来更改动作的签名

public JsonResult DatatablesSearchTest([FromBody]RootModel rootModel) //Columns contains 0 items
{
//List<DataTableColumn> test = Columns;
return Json(new { success = true });
}

请注意,如果没有[FromBody],将给您空对象。

我希望这能帮助你解决这个问题。

最新更新