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

时间:2019-03-29 16:51:54

标签: c# asp.net-mvc datatable

我有以下服务器端代码,用于处理搜索,排序和分页。但是,每列只能进行一次排序。如果我再次单击排序,它不会响应。另外,当我调试代码时,我发现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"
                },

            ],

        });

有人可以告诉我为什么每列只能进行一次排序吗?

0 个答案:

没有答案