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

时间:2012-10-22 04:28:25

标签: ajax asp.net-mvc asp.net-mvc-3 model-binding 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.
}

KendoSort是一个自定义类:

public class KendoSort
{
    public string Field { get; set; }
    public string Dir { get; set; }
}

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

sort[1][field]: reportName
sort[1][dir]: asc

基本上它会说“按升序排序,然后按升序排序”。如何将这些数据导入我的操作方法而无需在Request中进行操作并手动解析参数?

2 个答案:

答案 0 :(得分:6)

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

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

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

  3. 更新问题作者:

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