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