为Kendo网格定制服务器排序

时间:2017-11-08 08:17:10

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

我需要在Kendo网格上应用自定义服务器排序。 他是我的实体:

public class User
{
    public virtual ICollection<Region> Regions { get; set; }
    //other properties 
} 

public class Region 
{
    public string Name { get; set; }
}

我想按Regions集合中第一个区域的名称对用户进行排序。对于其他排序,使用了过滤和分页.ToDataSourceResult(request)扩展方法,但似乎我的方案不支持开箱即用。这就是为什么我首先尝试手动排序IQuearable,删除SortDescriptor然后调用.ToDataSourceResult(request)

    private IQueryable<User> FilterByRegions(IQueryable<User> users, IList<SortDescriptor> sortings)
    {
        var regionsSort = sortings?.FirstOrDefault(x => x.Member == "Regions");
        if (regionsSort == null)
            return users;

        sortings.Remove(regionsSort);

        Expression<Func<User, object>> exp = user => user.Regions.OrderBy(x => x.Name).Select(x => x.Name).FirstOrDefault();

        if (regionsSort.SortDirection == ListSortDirection.Ascending)
            return users.OrderBy(exp);
        else
            return users.OrderByDescending(exp);
    }

用法:

    public ActionResult Read([DataSourceRequest] DataSourceRequest request)
    {
        IQueryable<User> users = _userApplicationService.GetAll();

        users = FilterByRegions(users, request.Sorts);

        DataSourceResult result = users.ToDataSourceResult(request);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

但似乎调用.ToDataSourceResult(request)会忽略我以前的排序。

如何达到预期效果?在使用IQueryable之前,是否可以向.ToDataSourceResult(request)添加一些自定义逻辑?

我知道可以使用DataSourceRequest request手动构建查询,但这很糟糕,因为我有很多不同的过滤器和排序。

谢谢。

1 个答案:

答案 0 :(得分:0)

我有类似的要求,我必须使用Kendo Grid实现自定义服务器端分页和排序。根据{{​​3}},您应该将ToDataSourceResult扩展方法中的request参数更改为空请求,而不是传入参数请求。 所以 d应更改为v。这样做有助于我正确实现服务器端分页和排序。