1

如何配置 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,但我目前仍在试用版中,其中不包含源代码。

4

2 回答 2

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.c​​om/forums/framework/data-source/configure-the-kendo-ui-datasource-so-it-would-issue-requests-only -for-specific-displayed-fields.aspx#2131604

于 2012-06-01T13:15:25.900 回答
0

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

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();
}
于 2015-08-26T15:57:48.187 回答