模型绑定来自KendoUI Grid的排序字段

Che*_*hev 5 ajax asp.net-mvc model-binding asp.net-mvc-3 kendo-ui

我正在使用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.
}
Run Code Online (Sandbox Code Playgroud)

KendoSort是一个自定义类:

public class KendoSort
{
    public string Field { get; set; }
    public string Dir { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我知道我做得不对.我的操作方法应如何正确捕获为排序提供的数据?屏幕截图仅显示排序集合中的单个项目,但网格可以传递更多.例如,它还可能包含一个额外的类别:

sort[1][field]: reportName
sort[1][dir]: asc
Run Code Online (Sandbox Code Playgroud)

基本上它会说"按升序排序,然后按升序排序".如何将这些数据导入到我的操作方法中而不必四处寻找Request并手动解析参数?

Ata*_*hev 6

ASP.NET MVC模型绑定器不理解表达式sort[0][field].它只能理解sort[0].field哪个是不幸的,因为它jQuery.ajax以前一种格式提交嵌套对象.

有两种方法可以解决问题:

  1. 使用Kendo UI Complete for ASP.NET MVC.它带有一个内置的网格请求模型.更多信息可以在这里找到.
  2. 创建一个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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

问题作者的更新:

我最终使用参数映射,但不是重新构造排序字段,而是简单地对选项进行字符串化并在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);
    }
}
Run Code Online (Sandbox Code Playgroud)