我正在使用KendoUI Grid来显示数据。我的服务器分页工作就像一个魅力。 kendo网格中的每个页面更改是对服务器的新ajax请求,服务器返回正确的数据页面。我现在正在尝试进行服务器端排序,但是我无法将模型绑定绑定到排序值。
这就是Kendo Grid的请求:
我的行动方法如下:
public JsonResult GetReports(int pageSize, int skip, List<KendoSort> sort)
{
// sort is not being populated with the right data.
}
KendoSort是一个自定义类:
public class KendoSort
{
public string Field { get; set; }
public string Dir { get; set; }
}
我知道我做得不对。我的操作方法应如何正确捕获为排序提供的数据?屏幕截图仅显示排序集合中的单个项目,但网格可以传递更多。例如,它还可能包含一个额外的类别:
sort[1][field]: reportName
sort[1][dir]: asc
基本上它会说“按升序排序,然后按升序排序”。如何将这些数据导入我的操作方法而无需在Request
中进行操作并手动解析参数?
答案 0 :(得分:6)
ASP.NET MVC模型绑定器不理解sort[0][field]
之类的表达式。它仅理解sort[0].field
,这是不幸的,因为jQuery.ajax
以前一种格式提交嵌套对象。
有两种方法可以解决问题:
创建parameterMap并翻译排序表达式:
parameterMap: function(options) {
var result = {
pageSize: options.pageSize,
skip: options.skip
};
if (options.sort) {
for (var i = 0; i < options.sort.length; i++) {
result["sort[" + i + "].field"] = options.sort[i].field;
result["sort[" + i + "].dir"] = options.sort[i].dir;
}
}
return result;
}
我最终使用参数映射,但不是重新构造排序字段,而是简单地对选项进行字符串化并在CRUD传输上指定contentType。只要指定了contentType,模型绑定器就知道绑定到字符串化的JSON。
transport: {
read: {
url: '...',
type: 'POST',
contentType: 'application/json'
},
update: {
url: '...',
type: 'POST',
contentType: 'application/json'
},
destroy: {
url: '...',
type: 'POST',
contentType: 'application/json'
},
create: {
url: '...',
type: 'POST',
contentType: 'application/json'
},
parameterMap: function (options, type) {
return JSON.stringify(options);
}
}
答案 1 :(得分:3)
我使用IDictionary<string, string>[] sort
从另一个线程找到了答案,这似乎是捕获服务器端排序条件的最优雅,最干净的方法。我没有使用自定义模型绑定器,如示例代码所示。我只是使用IDictionary数组捕获排序标准,然后将该标准应用于我自己的数据源。以下是该讨论主题的链接:Using IDictionary array to capture Kendo UI sorting criteria