我正在尝试将jQuery Datatables 1.10用于服务器端处理和ASP.NET MVC 5.不幸的是,Datatables 1.10通过将复杂的对象层次序列化为参数字符串(Content-Type: application/x-www-form-urlencoded
来写入服务器),breaks the MVC ModelBinder。
在MVC中,有没有办法将复杂的对象层次结构作为序列化参数列表进行绑定?也许有人写过自定义的ModelBinder?
注意:
在traditional = true
调用中设置ajax
不起作用,因为它不支持对象的层次结构。我最终得到了类似的东西:
draw=1&
columns=[object Object]&
columns=[object Object]&
order=[object Object]&
start=0&
length=10&
search=[object Object]
如果数据是由DataTables作为JSON发送的,那么我认为一切都会好的。问题源于数据作为参数列表发送的事实。
同时注意
接线表的代码:
$("#serverTable").DataTable({
serverSide: true,
ajax: {
url: '/Home/GetTableData',
type: 'POST'
}
});
答案 0 :(得分:4)
DataTables 1.10(新API)的问题在于它的请求结构与ASP.NET MVC绑定引擎不完全兼容。
您可以编写自己的活页夹,也可以手动处理从QueryString(GET)或Form(POST)中的DataTables发送的每个参数。您可以覆盖它以支持其他方法。
我项目背后的整个意识形态是让你不要一次又一次地处理请求参数。只需设置活页夹并使用模型:https://github.com/ALMMa/datatables-mvc
在GitHub项目的第一页上,有一个示例代码,用于设置绑定器和处理列排序/排序。
正如项目中所描述的,DataTables发送的排序信息在某些情况下很有用(直接SQL命令),但如果您使用静态列表/枚举或常规linq(尽管您可以使用Dynamic Linq,可能不是那么好)帮助这个)。
今天我提交了一些新代码来帮助您自定义/扩展常规绑定器或以更友好的方式创建JSON绑定器,并帮助从模型中获取过滤/排序列。
答案 1 :(得分:2)
尝试一下:https://github.com/ALMMa/datatables-mvc
它是新DataTable 1.10输入的自定义ModelBinder实现。我昨天才发现它,我仍在努力实施。所以我不能说它有多好用;我还没到达测试点。但它看起来不错,我打算使用它。
答案 2 :(得分:2)
几天前我遇到了同样的问题,解决方案很简单。您可以阅读here有关它的更多信息。
您只需传入一个函数作为ajax数据属性的回调。 回调函数将数据作为JSON字符串返回:
var opts =
{
'ajax' :
{
'url': 'serverSideTableProviderPage',
'type': 'POST',
'contentType': 'application/json; charset=utf-8',
'data':function(data)
{
return data = JSON.stringify(data);
}
},
'pagingType': 'simple',
[more options ...]
}
$('table').dataTable(opts);
数据现在作为Json发送,ModelBinder将填充深层嵌套对象属性。别忘了将contentType设置为" application / json;字符集= UTF-8"