5

我正在使用 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

基本上它会说“按id升序排序,然后按reportName升序排序”。我怎样才能将这些数据放入我的操作方法中,而不必四处寻找Request并手动解析参数?

4

2 回答 2

6

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

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

  1. 为 ASP.NET MVC 使用 Kendo UI Complete。它带有用于网格请求的内置模型。更多信息可以在这里找到。
  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;
    }
    

来自问题作者的更新:

我确实最终使用了参数映射,但我没有重新构造排序字段,而是简单地对选项进行字符串化并在 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);
    }
}
于 2012-10-22T08:33:57.587 回答
3

我从另一个线程使用 找到了答案IDictionary<string, string>[] sort,这似乎是在服务器端捕获排序标准的最优雅和最干净的方式。如示例代码所示,我没有使用自定义模型绑定器。我只是使用 IDictionary 数组捕获排序标准,然后将该标准应用于我自己的数据源。这是该讨论线程的链接:使用 IDictionary 数组捕获 Kendo UI 排序标准

于 2012-11-14T19:20:25.437 回答