自定义网格过滤表达式

Custom Grid Filtering Expressions

快速项目背景:我正在将一些用于 ASP.NET grids/back 端数据源的 Telerik 移植到 Kendo angular UI 框架。

问题:我正在尝试实施网格过滤(必须自定义,因为我手动绑定以处理复杂的 paging/data 检索。

  1. 是否有 method/function 检索过滤器字符串而不是包含过滤器和运算符的对象模型? (显然,我可以自己将其展平,但这是一些代码)。这是一个代码片段...

if (filter !== undefined) {
            // Step through column filters
            filter.filters.forEach((element: any) => {
                // console.log(element);

                // Step through individual filter for column
                element.filters.forEach((curFilter: any) => {
                    console.log(curFilter.field);
                    console.log(curFilter.operator);
                    console.log(curFilter.value);
                });
            });
        }

  1. 我仍在使用 .NET 网格用于其过滤器表达式的动态 linq 查询。来自 grid.filters 的过滤器表达式是否可以与后端的 linq 动态查询一起正常工作,或者我是否需要转换?

我觉得我在这里遗漏了一些东西,所以我想开始对话。

谢谢! -布莱恩

我相信根据您的评论回答,您试图做的是获取过滤器和排序,就像在网络上为 MVC 发送的一样进行分页。

要kendo执行此操作,您需要设置数据源类型并在页面中包含正确的文件。

文件名为kendo.aspnetmvc.js或kendo.aspnetmvc.min.js

并且您的数据源初始化应指定

dataSource: {
   transport: {
      type: 'aspnetmvc-ajax'
   }
}

或者做他们正在做的同样的事情

此脚本的 cdn 是 https://kendo.cdn.telerik.com/2018.1.221/js/kendo.aspnetmvc.min.js

我知道他们使用诸如此类的函数来完成您所说的事情

function serializeFilter(filter, encode) {
            if (filter.filters) {
                return $.map(filter.filters, function (f) {
                    var hasChildren = f.filters && f.filters.length > 1, result = serializeFilter(f, encode);
                    if (result && hasChildren) {
                        result = '(' + result + ')';
                    }
                    return result;
                }).join('~' + filter.logic + '~');
            }
            if (filter.field) {
                return filter.field + '~' + filter.operator + '~' + encodeFilterValue(filter.value, encode);
            } else {
                return undefined;
            }
        }