有很多这样的问题,但是我找不到我在特定情况下做错的事情。我正在尝试构建对象的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]
来更改动作的签名:
public JsonResult DatatablesSearchTest([FromBody]RootModel rootModel) //Columns contains 0 items
{
//List<DataTableColumn> test = Columns;
return Json(new { success = true });
}
我希望这可以帮助您解决问题。