Я работаю над приложением ASP.NET Core MVC и использую JQuery Datatable в своем приложении. Моя таблица данных не сортируется при нажатии кнопки сортировки в заголовке столбца. Моя таблица данных показана ниже:
<table class = "table display table-bordered" id = "DATATABLE">
</table>
Внутри тега <script>:
$("#DATATABLE").DataTable({
serverSide: true,
filter: true,
searchDelay: 1000,
scrollY: StaticData.TABLE_HEIGHT + 'px',
lengthMenu: StaticData.TABLE_PAGE_SIZE,
language: { searchPlaceholder: "Name, Teacher" },
scrollCollapse: true,
ajax: {
url: '/STUD_MANAGEMENT/LoadStud',
type: 'GET',
datatype: 'json',
headers: { 'RequestVerificationToken': 'your json token' },
data: (d) => {
return { draw: d.draw, start: d.start, length: d.length, search: d.search.value, FilterByColumn: d.columns[d.order[0].column].data, ASC_DSEC: d.order[0].dir }
},
beforeSend: () => { ShowLoader(); },
complete: () => { HideLoader(); },
dataSrc: (json) => {
json = json.data;
return json;
}
},
columnDefs: [{ className: "dt-center", targets: [5, 6, 7, 8, 11], width: '2%', }],
columns: [
{ data: 'STUD_ID', title: 'STUD ID', autoWidth: false, visible: false },
{ data: 'CLASS_ID', title: 'CLASS ID', autoWidth: false, visible: false },
{ data: 'NAME', title: 'Name', autoWidth: true, searchable: true },
{ data: 'AGE', title: 'Age', autoWidth: true },
{ data: 'TEACHER', title: 'Teacher', autoWidth: true },
]
});
А метод LoadStud в контроллере показан ниже:
public IActionResult LoadStud(int draw = 1, int start = 0, int length = 10, string search = "", string FilterByColumn = "", string ASC_DSEC = "")
{
List<STUD_MANAGEMENT> ListData = new List<STUD_MANAGEMENT>();
int recordsTotal = 0;
STUD_MANAGEMENT dm = new STUD_MANAGEMENT();
dm.STUD_ID = 1;
dm.CLASS_ID = 1;
dm.NAME = "James";
dm.TEACHER = "SEPHORA";
dm.AGE = "12";
STUD_MANAGEMENT dm1 = new STUD_MANAGEMENT();
dm1.STUD_ID = 2;
dm1.CLASS_ID = 2;
dm1.NAME = "Naneem";
dm1.TEACHER = "Chithra";
dm1.AGE = "15";
STUD_MANAGEMENT dm11 = new STUD_MANAGEMENT();
dm11.STUD_ID = 3;
dm11.CLASS_ID = 3;
dm11.NAME = "Sony";
dm11.TEACHER = "Mano USA";
dm11.AGE = "3";
ListData.Add(dm);
ListData.Add(dm1);
ListData.Add(dm11);
recordsTotal = ListData.Count();
var jsonData = new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = ListData };
return Ok(jsonData);
}
Класс STUD_MANAGEMENT показан ниже:
public class STUD_MANAGEMENT
{
public int STUD_ID { get; set; }
public int CLASS_ID { get; set; }
public string NAME { get; set; }
public int AGE { get; set; }
public string TEACHER { get; set; }
}
Нет ошибок в консоли разработчика
В Stack Overflow есть различные вопросы о DataTables, где спрашивающий использует serverSide: true, но затем задается вопросом, почему сортировка (или какой-либо другой аспект DataTables) не работает. Это говорит о том, что задавший вопрос может не понимать, почему вообще предоставляется обработка на стороне сервера. Он предназначен для помощи в тех случаях, «когда чтение данных из DOM просто слишком медленное или громоздкое» (см. ссылку). Другими словами, это необходимо, когда у вас достаточно большие объемы данных.
Я часто думаю, что фактическое решение может быть таким: не использовать обработку на стороне сервера, потому что обработка на стороне сервера вам не нужна. Ваши объемы данных недостаточно велики, чтобы этого требовать. Вместо этого используйте значение по умолчанию (false) — и позвольте DataTables обрабатывать всю логику сортировки, фильтрации и разбиения на страницы, поэтому вам не нужно предоставлять какую-либо логику самостоятельно. (Я не знаю, верно ли это в данном конкретном вопросе, поскольку в вопросе не было предоставлено никаких соответствующих подробностей.)





При включенной обработке на стороне сервера все действия по разбиению на страницы, поиску и упорядочиванию, которые выполняет DataTables, передаются на сервер, где механизм SQL (или аналогичный) может выполнять эти действия с большим набором данных.
В нем упоминается, что ответственность за выполнение этих операций лежит на серверной части.
Ваша текущая реализация не охватывает порядок.
Простой способ заключается в том, что вам нужно проверить на основе FilterByColumn и ASC_DSEC, чтобы упорядочить значение свойства, отсортировав порядок соответствующим образом.
if (!String.IsNullOrEmpty(FilterByColumn))
{
ASC_DSEC = ASC_DSEC.ToUpper();
ASC_DSEC = ASC_DSEC == "ASC" || ASC_DSEC == "DESC"
? ASC_DSEC
: "ASC";
switch (FilterByColumn.ToUpper())
{
case "STUD_ID":
ListData = ASC_DSEC == "ASC"
? ListData.OrderBy(x => x.STUD_ID).ToList()
: ListData.OrderByDescending(x => x.STUD_ID).ToList();
break;
case "CLASS_ID":
ListData = ASC_DSEC == "ASC"
? ListData.OrderBy(x => x.CLASS_ID).ToList()
: ListData.OrderByDescending(x => x.CLASS_ID).ToList();
break;
case "NAME":
ListData = ASC_DSEC == "ASC"
? ListData.OrderBy(x => x.NAME).ToList()
: ListData.OrderByDescending(x => x.NAME).ToList();
break;
case "AGE":
ListData = ASC_DSEC == "ASC"
? ListData.OrderBy(x => x.AGE).ToList()
: ListData.OrderByDescending(x => x.AGE).ToList();
break;
case "TEACHER":
ListData = ASC_DSEC == "ASC"
? ListData.OrderBy(x => x.TEACHER).ToList()
: ListData.OrderByDescending(x => x.TEACHER).ToList();
break;
}
}
var jsonData = new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = ListData };
Однако это не лучший способ, учитывая расширяемость и удобство обслуживания: например, в будущем вы можете добавить новое свойство, изменить имя свойства или удалить свойство.
Если вы ищете продвинутый способ, работайте с System.Reflection.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Linq;
if (!String.IsNullOrEmpty(FilterByColumn))
{
PropertyInfo propInfo = typeof(STUD_MANAGEMENT).GetProperty(FilterByColumn, BindingFlags.Public | BindingFlags.Instance);
if (propInfo != null)
{
switch (ASC_DSEC.ToUpper())
{
case "ASC":
ListData = ListData.OrderBy(x => propInfo.GetValue(x, null)).ToList();
break;
case "DESC":
ListData = ListData.OrderByDescending(x => propInfo.GetValue(x, null)).ToList();
break;
}
}
}
var jsonData = new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = ListData };
Любая ошибка в консоли разработчика?