Возможность сортировки данных на стороне сервера работает только один раз - PullRequest
0 голосов
/ 29 марта 2019

У меня есть следующий код на стороне сервера, который обрабатывает поиск, сортировку и разбиение на страницы.Однако сортировка работает только один раз для каждого столбца.Если я снова нажму на сортировку, она не ответит.Также, когда я отлаживал код, я видел, что 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"
                },

            ],

        });

Может кто-нибудь любезно сказать мне, почему сортировка работает только один раз на столбец?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...