数据表服务器端处理排序功能仅工作一次



我有以下服务器端代码来处理搜索、排序和分页。但是,每列仅执行一次排序。如果我再次单击排序,它没有响应。另外,当我调试代码时,我看到sortBy 和 SortDir 是正确的。但是,结果似乎不受这两个变量的影响。

这是我的代码:

 public JsonResult CustomServerSideSearchAction(DataTableAjaxPostModel model)
 {
        // action inside a standard controller
        int filteredResultsCount;
        int totalResultsCount;
        var res = YourCustomSearchFunc(model, out filteredResultsCount, out totalResultsCount);
        var result = new List<Member>(res.Count);
        foreach (var s in res)
        {
            // simple remapping adding extra info to found dataset
            result.Add(new Member
            {
               Id = s.Id,
               CardNumber = s.CardNumber, 
               FullName   = s.FullName, 
               RegistrationDate = s.RegistrationDate,
               Address =    s.Address, 
               PhoneNumber = s.PhoneNumber, 
               Email = s.Email
            });
        };
        Debug.WriteLine(result); 
        return Json(new
        {
            // this is what datatables wants sending back
            draw = model.draw,
            recordsTotal = totalResultsCount,
            recordsFiltered = filteredResultsCount,
            data = result
        }, JsonRequestBehavior.AllowGet);
    }
    public IList<MemberDto> YourCustomSearchFunc(DataTableAjaxPostModel model, 
        out int filteredResultsCount, out int totalResultsCount)
    {
        var searchBy = (model.search != null) ? model.search.value : null;
        var take = model.length;
        var skip = model.start;
        string sortBy = "";
        bool sortDir = true;
        if (model.order != null)
        {
            // in this example we just default sort on the 1st column
            sortBy = model.columns[model.order[0].column].data;
            sortDir = model.order[0].dir.ToLower() == "asc";
        }
        // search the dbase taking into consideration table sorting and paging
        var result = GetMembers(searchBy, take, skip, sortBy, sortDir, out filteredResultsCount, out totalResultsCount);
        if (result == null)
        {
            // empty collection...
            return new List<MemberDto>();
        }
        return result;
    }
    public List<MemberDto> GetMembers(string searchBy, int take, int skip, string sortBy, 
        bool sortDir, out int filteredResultsCount, out int totalResultsCount)
    {
        var result = new List<MemberDto>(); 
        if (String.IsNullOrEmpty(searchBy))
        {
            result = _context.Members                          
                       .Select(m => new MemberDto
                       {
                           Id = m.Id,
                           FullName = m.FullName,
                           RegistrationDate = m.RegistrationDate,
                           CardNumber = m.CardNumber,
                           Address = m.Address,
                           Email = m.Email,
                           PhoneNumber = m.PhoneNumber,
                       })
                       .OrderBy(sortBy, sortDir)
                        .Skip(skip)
                       .Take(take)     // have to give a default order when skipping .. so use the PK                           
                       .ToList();
            filteredResultsCount = _context.Members.Count();
        }
        else
        {                 
            result = _context.Members
                      .Where(p => p.FullName.Contains(searchBy))
                       .Select(m => new MemberDto
                       {
                           Id = m.Id,
                           FullName = m.FullName,
                           RegistrationDate = m.RegistrationDate,
                           CardNumber = m.CardNumber,
                           Address = m.Address,
                           Email = m.Email,
                           PhoneNumber = m.PhoneNumber,
                       })
                       .OrderBy(sortBy, sortDir) 
                       .Skip(skip)
                       .Take(take)
                       .ToList();
            filteredResultsCount = _context.Members.Where(p => p.FullName.Contains(searchBy)).Count();
        }
        totalResultsCount = _context.Members.Count();
        return result;
    }

这是视图:

$(document).ready(function () {
        var table = $('#members').DataTable({
             "processing": true,
            "serverSide": true,
            "ajax": {
                url: "@Url.Action("CustomServerSideSearchAction", "Member")",
                type: 'POST'
            },
            "language": {
                "search": "",
                "searchPlaceholder": "Search..."
            },
            columns: [
                {
                    data: "CardNumber"
                },
                {
                    data: "RegistrationDate",
                },
                {
                    data: "FullName",
                },
                {
                    data: "Address"
                },
                {
                    data: "PhoneNumber"
                },
                {
                    data: "Email"
                },
            ],
        });

有人可以告诉我为什么每列排序只工作一次吗?

解决方案:使用扩展方法

public static class GenericSorterExtension
{
    public static List<T> Sort<T>(this List<T> list, string sortBy_sortDirection)
    {
        string[] sortProperties = sortBy_sortDirection.Split(' ');
        
        //if(sortProperties.l > 2)
        var param = Expression.Parameter(typeof(T), "item");
        var sortExpression = Expression.Lambda<Func<T, object>>
            (Expression.Convert(Expression.Property(param, sortProperties[0]), typeof(object)), param);
        switch (sortProperties[1].ToLower())
        {
            case "asc":
                list = list.AsQueryable<T>().OrderBy<T, object>(sortExpression).ToList();
                break;
            default:
                list = list.AsQueryable<T>().OrderByDescending<T, object>(sortExpression).ToList();
                break;
        }
        return list;
    }       
}

最新更新