【问题标题】:Model binding the sort field from KendoUI Grid模型绑定来自 KendoUI Grid 的排序字段
【发布时间】:2012-10-22 04:28:25
【问题描述】:

我正在使用 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 中四处寻找并手动解析参数?

【问题讨论】:

  • 为什么不使用内置的DataSourceRequestDataSourceRequestModelBinder 作为您的操作参数?然后您的操作将类似于public JsonResult GetReports([DataSourceRequest]DataSourceRequest request),其中请求对象包含所有需要的数据。
  • 我想我可以走那条路。我还没有将 Kendo Mvc 二进制文件添加到项目中。采用纯 HTML5 方法。我想我仍然可以这样做,但使用一些类似的服务器端细节。

标签: ajax asp.net-mvc asp.net-mvc-3 model-binding kendo-ui


【解决方案1】:

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;
    }
    

来自问题作者的更新:

我确实最终使用了参数映射,但我没有重新构造排序字段,而是简单地将选项字符串化并在 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);
    }
}

【讨论】:

  • 我会接受你的答案,因为我使用了 parameterMap,但我会在你的答案后面加上我实际所做的。
【解决方案2】:

我使用IDictionary&lt;string, string&gt;[] sort 从另一个线程中找到了答案,这似乎是在服务器端捕获排序标准的最优雅、最简洁的方法。如示例代码所示,我没有使用自定义模型绑定器。我只是使用 IDictionary 数组捕获排序标准,然后将该标准应用于我自己的数据源。这是该讨论主题的链接:Using IDictionary array to capture Kendo UI sorting criteria

【讨论】:

  • 谢谢!这实际上比公认的答案要简单得多。
猜你喜欢
  • 1970-01-01
  • 2018-07-11
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多