Kendo UI jQuery网格服务器端过滤

时间:2019-11-16 07:55:37

标签: jquery asp.net-web-api kendo-ui kendo-grid dapper

我正在使用Kendo UI for jQuery Grid显示一些数据。到目前为止,我正在使用客户端过滤和分页,其中所有数据记录都是在对服务器的初始调用中返回的(在服务器端使用了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。

1 个答案:

答案 0 :(得分:2)

毕竟找不到任何解决方法(即使是telerik支持也无法解决,也无法提出任何解决方法)。

因此决定采用自定义实现(也为可能遇到相同问题的所有开发人员创建了一个甜蜜的小工具)。

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

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

还有nuget包: Nuget Package

存储库也向所有人开放以供进一步定制:)