【问题标题】:DataSourceRequest - Filters null for Kendo UI GridDataSourceRequest - 为 Kendo UI Grid 过滤 null
【发布时间】:2018-07-19 02:20:35
【问题描述】:

我在 ASP.Net MVC5 应用程序中使用 Kendo UI Grid 并设置了一个列,以便当您对其进行过滤时,它会查询数据库以获取唯一结果。我这样定义列:

col.Filterable(x => x.Multi(true).Search(true).DataSource(ds => ds.Read(r => r.Action("UniqueColumn", "Workbook").Data("filterUniquenessColumn()").Type(HttpVerbs.Post)).ServerFiltering(true)));

这只会在您第一次访问时调用控制器,因为它已缓存。为了解决这个问题,我订阅了 ColumnMenuInit 事件并添加了以下代码:

var menu = e.container.find(".k-menu").data("kendoMenu");
menu.bind('open', function (ex) {
    if ($(ex.item).find('span.k-i-filter').length > 0) {
        var filterMultiCheck = e.container.find(".k-filterable").data("kendoFilterMultiCheck");
        if (filterMultiCheck) {

            if ($('#grid').data('kendoGrid').dataSource.filter() !== undefined) {
                var grid = $('#grid').data('kendoGrid');
                filterMultiCheck.checkSource.transport.options.read.data.filter = grid.dataSource.filter();                    
                filterMultiCheck.checkSource.options.type = 'aspnetmvc-ajax';
            }
            filterMultiCheck.checkSource.read();
        }
    }
});

每次他们去过滤时都会调用控制器(这是我想要的)。我遇到的问题是,在控制器端,我无法获取 [DataSourceRequest] DataSourceRequest 请求的 Filters 值,以使用应用于主网格的过滤器进行填充。过滤器的结果始终为空。这是我的控制器方法的样子:

        public ActionResult UniqueColumn([DataSourceRequest] DataSourceRequest request)

有谁知道如何获取要填充的请求的过滤器属性?我在网络上进行了跟踪,并通过 url 传递了以下内容:

过滤器%5B过滤器%5D%5B0%5D%5B字段%5D:PCode 过滤器%5B过滤器%5D%5B0%5D%5B操作员%5D: eq 过滤器%5B过滤器%5D%5B0%5D%5B值%5D: 00090h4210 过滤器%5Blogic%5D:和

如果有人能告诉我如何在控制器上获取过滤器,将不胜感激。

提前致谢。

【问题讨论】:

    标签: jquery asp.net-mvc kendo-grid kendo-asp.net-mvc


    【解决方案1】:

    如果这对任何人集成 kendo jQuery UI + .net core 2.0+ 有帮助,可以通过在我的应用程序中包含 kendo.aspnetmvc js 文件并设置 DataSource.type = "webapi" 来解决这个问题。

    链接:https://docs.telerik.com/kendo-ui/controls/data-management/grid/how-to/binding/web-api-server-operations

    关于我的项目的背景: 服务器:.NET Core 2.2 客户端:aurelia SPA (js)、打字稿

    【讨论】:

    • 测试了两种 GET/POST 请求类型,都适用于过滤/排序。
    • 就是这样。你节省了我的时间。
    【解决方案2】:

    如果其他人遇到此问题,我可以通过执行以下操作来解决它:

            if ($('#grid').data('kendoGrid').dataSource.filter() !== undefined) {
                        var grid = $('#grid').data('kendoGrid');
                        var parameterMap = grid.dataSource.transport.parameterMap;
                        var dataRequest = parameterMap({
                            sort: grid.dataSource.sort(),
                            filter: grid.dataSource.filter(),
                            group: grid.dataSource.group(),
            } 
    
    var request = decodeURIComponent($.param(dataRequest));                        
    filterMultiCheck.checkSource.transport.options.read.url = "/Workbook/UniqueColumn" + "?" + request;
    

    【讨论】: