首页 > 解决方案 > Kendo UI jQuery Grid 服务器端过滤

问题描述

我正在使用用于 jQuery Grid 的 Kendo UI 来显示一些数据。到目前为止,我正在使用客户端过滤和分页,其中所有数据记录都在对服务器的初始调用中返回(在服务器端使用 Web API 和 Dapper)。但是,随着数据源随着时间的推移而增长,从服务器一次调用中获取所有数据的想法不再可行。

我使用以下命令启用了服务器端分页和过滤选项:

serverPaging: true,
serverSorting: true,
serverAggregates: true,
serverFiltering: true,

过滤器和分页信息作为查询参数传递,例如:

take: 20
skip: 0
page: 1
pageSize: 20
filter[logic]: and
filter[filters][0][logic]: or
filter[filters][0][filters][0][value]: High
filter[filters][0][filters][0][operator]: eq
filter[filters][0][filters][0][field]: status
filter[filters][0][filters][1][value]: Medium
filter[filters][0][filters][1][operator]: eq
filter[filters][0][filters][1][field]: status
filter[filters][1][logic]: and
filter[filters][1][filters][0][field]: Name
filter[filters][1][filters][0][operator]: startswith
filter[filters][1][filters][0][value]: a
filter[filters][1][filters][1][field]: Name
filter[filters][1][filters][1][operator]: contains
filter[filters][1][filters][1][value]: a

所以我们面临的第一个问题是尝试将这些过滤器和其他参数映射到一些 Kendo 提供的 DTO(我们使用了 Kendo MVC 控件DataSourceRequest类),但过滤器永远不会正确映射到那个。我也知道[FromUri][FromBody]选项的使用,所以不需要提及任何这样的解决方案:)

我的下一个担心是,即使以某种方式(暂时假设)我能够正确地将过滤器和其他参数映射到某些 DTO,我们如何才能在我们的数据源上实际使用这些过滤器,实际上它是由 Dapper 组成的SQL 查询。

此外,我还想避免手动过滤器解析和生成动态 where 子句。

就 Kendo 文档而言,虽然有这样一个可行的演示,但服务器功能要么不存在,要么可用的功能对我们没有太大用处,如下所示:

    public ActionResult Remote_Binding_Orders_Read([DataSourceRequest]DataSourceRequest request)
    {
        return Json(GetOrders().ToDataSourceResult(request));
    }

正如在 Kendo jQuery Grid 中尝试过的那样,过滤器永远不会映射到DataSourceRequest.

同样,由于我们使用的是 Dapper,以下代码也没有太大帮助:

public static IQueryable<OrderViewModel> ApplyOrdersFiltering(this IQueryable<OrderViewModel> data, IList<IFilterDescriptor> filterDescriptors)
{
    if (filterDescriptors != null && filterDescriptors.Any())
    {
        data = data.Where(ExpressionBuilder.Expression<OrderViewModel>(filterDescriptors, false));
    }
    return data;
}

orders = orders.ApplyOrdersFiltering(request.Filters);

如果有人遇到同样的问题并找到一些解决方法,那么我们将不胜感激。

注意:从 Dapper 更改为 Entity Framework 不是一种选择,这同样适用于 Kendo jQuery Grid。

标签: jqueryasp.net-web-apikendo-uikendo-griddapper

解决方案


毕竟无法找到一些解决方法(即使是telerik支持也只是转来转去,无法提出任何解决方法)。

因此决定进行自定义实现(也为可能遇到相同问题的任何和所有开发人员创建了一个甜蜜的 nuget)。

因此必须手动生成可用于创建动态 WHERE、ORDER BY、GROUP BY 和 SELECT(用于聚合)子句的表达式。

有关更多详细信息,请参阅以下存储库: KendoGridFASMS

还有nuget包: Nuget包

此外,该存储库对所有人开放以进行进一步定制:)

截至 2020 年 3 月 16 日:

该库现在也支持 .NET Core 和 .NET Standard Frameworks。


推荐阅读