DataSourceRequest-筛选Kendo UI网格的null

时间:2018-07-19 02:20:36

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

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

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传递了以下内容:

filter%5Bfilters%5D%5B0%5D%5Bfield%5D:PCode    filter%5Bfilters%5D%5B0%5D%5Boperator%5D:eq    filter%5Bfilters%5D%5B0%5D%5Bvalue%5D:00090h4210    filter%5Blogic%5D:和

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

谢谢。

2 个答案:

答案 0 :(得分: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),打字稿

答案 1 :(得分:0)

万一其他人遇到此问题,我可以通过以下方法解决:

        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;