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

限制绑定到OData服务的Kendo UI网格的请求字段集,odata,kendo-ui,Odata,Kendo Ui,如何配置剑道UI网格,使其仅对特定(显示)字段发出请求 在我的实例中,kendoui网格绑定到OData服务。该服务公开了一个包含许多(200+)字段的表。该应用程序允许用户配置网格的显示字段集,设置初始过滤器和排序参数。应用程序配置网格,然后网格关闭并查询OData服务 网格kendo.Data.DataSource定义为: var gridDataSource = new kendo.data.DataSource({ type: "odata", transport: {

如何配置剑道UI网格,使其仅对特定(显示)字段发出请求

在我的实例中,kendoui网格绑定到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: ...
}
以下是网格发布的示例请求(由Firebug捕获):

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

http://localhost:22411/Data/Comp?%24inlinecount=allpages&%24top=1000&%24filter=DistrictCode+eq+%27460800%27&%24select=DistrictCode,DistrictName,DistrictNumber
同样,如何配置网格以实现这一点


我意识到剑道用户界面的源代码是可用的,但我目前仍在试用版本,其中不包括源代码

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

我将事件处理程序附加到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论坛上发布了这个问题:

我遇到了一个类似的问题,并实现了一种方法,在传输的读取
数据
回调中构造一个包含列的数组:

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

    var data = {};

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

    return data;
}
如果您使用的是“列”菜单且具有隐藏列,则还可以根据哪些列可见进行筛选,并在启用列时强制网格刷新

columnShow: function (e) {
    e.sender.dataSource.read();
}
columnShow: function (e) {
    e.sender.dataSource.read();
}