限制请求绑定到OData服务的Kendo UI Grid的字段集

时间:2012-06-01 09:44:26

标签: odata kendo-ui

如何配置Kendo UI网格,以便仅针对特定(显示)字段发出请求?

在我的实例中,Kendo UI网格绑定到OData服务。该服务公开一个包含许多(200+)个字段的表。该应用程序允许用户配置网格的显示字段集,设置初始过滤器和排序参数。该应用程序配置网格,然后关闭并查询OData服务。

网格kendo.Data.DataSource定义为:

var gridDataSource = new kendo.data.DataSource({
    type: "odata",
    transport: {
        read: {
            url: "@Url.Content(dynDataSource.Url)",
            contentType: "application/json; charset=utf-8",
            type: "GET",
            dataType: "json"
        }
    },
    pageSize: @Model.MaxPageSize,
    serverPaging: true,
    serverFiltering: true,
    serverSorting: true,
    filter: ...
}

这是Grid发布的示例请求(由Firebug捕获):

http://localhost:22411/Data/Comp?%24inlinecount=allpages&%24top=1000&%24filter=DistrictCode+eq+%27460800%27

这将返回表的所有字段,这是一个问题。需要通过仅选择所需字段来限制字段,其请求如下所示:

http://localhost:22411/Data/Comp?%24inlinecount=allpages&%24top=1000&%24filter=DistrictCode+eq+%27460800%27&%24select=DistrictCode,DistrictName,DistrictNumber

同样,如何为此配置网格?

我意识到源代码可用于Kendo UI,但我目前仍在使用不包含源代码的试用版。

2 个答案:

答案 0 :(得分:0)

我想我自己有一个可行的解决方案。我在这篇博文中使用了一个想法:

http://community.dynamics.com/product/crm/crmtechnical/b/zhongchenzhoustipstricksandportaldevelopment/archive/2012/05/20/how-to-use-kendo-ui-datasource-kendo-ui-grid-with-dynamics-crm-2011-rest-endpoint.aspx

我附加了一个事件处理程序ajaxSend事件,监视我的OData服务URL,一旦检测到这样的请求,就将select列列表附加到URL。这是代码:

$(document).ajaxSend(function (e, jqxhr, settings) {
  if (settings.url.toLowerCase().indexOf("@Url.Content(dynDataSource.Url)".toLowerCase()) >= 0) {
      settings.url += "&%24select=@requestColumnList";
  }
});

希望这会有所帮助。不过,如果有人有更好的解决方案,我想听听。

我也将此问题发布到Telerik论坛:http://www.kendoui.com/forums/framework/data-source/configure-the-kendo-ui-datasource-so-it-would-issue-requests-only-for-specific-displayed-fields.aspx#2131604

答案 1 :(得分:0)

我遇到了类似的问题并实现了一种方法,该方法在传输的dependencies { classpath 'com.android.tools.build:gradle:1.3.0' } 回调中构建了一系列包含的列:

data

如果您使用的是列菜单并且隐藏了列,则还可以根据可见的列进行过滤,并在启用列时强制网格刷新。

dataSource.transport.read.data = function(options) {

    var data = {};

    data["$select"] = columns.map(function(c) {
        return c.field;
    });

    return data;
}