【问题标题】:Custom server sorting for Kendo grid剑道网格的自定义服务器排序
【发布时间】:2017-11-08 08:17:09
【问题描述】:

我需要在 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) 忽略了我之前的排序。

我怎样才能达到预期的效果?是否可以在使用.ToDataSourceResult(request) 之前向IQueryable 添加一些自定义逻辑?

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

谢谢。

【问题讨论】:

  • 它没有忽略。如果您有其他类型,则需要创建不同的表达式。这就是 Linq 的工作方式。请注意,您只能拥有一个OrderBy...。任何进一步的将取代前一个。在 Linq 中,您需要使用 ThenBy...。我的建议是在您明确发送区域名称时创建投影,然后修改请求排序以添加新的投影属性。
  • 你可以尝试类似here的方法

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


【解决方案1】:

我有一个类似的要求,我必须使用 Kendo Grid 实现自定义服务器端分页和排序。根据this post,应该将ToDataSourceResult扩展方法中的request参数改为空请求,而不是传入参数request。 所以 DataSourceResult result = users.ToDataSourceResult(request); 应更改为 DataSourceResult result = users.ToDataSourceResult(new DataSourceRequest());。这样做有助于我正确实现服务器端分页和排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-10-21
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多