Я новичок в таблицах данных jQuery, использующих AJAX в ASP.NET Core 6 MVC. Я включил свой код как в представление, так и в контроллер. Я пытаюсь получить данные от контроллера и отобразить их в представлении, содержащем DataTable, в событии нажатия кнопки.
Вид:
<div>
<div style = "padding-top: 20px; padding-bottom:20px">
<button class = "btn btn-lg btn-primary" onclick = "javascript:runReport();">Run
Report</button>
</div>
<div>
<table class = "table table-bordered table-striped" id = "riskReport">
<thead class = "bg-dark text-white">
<tr>
<th>CustomerNumber</th>
<th>CustomerStatus</th>
<th>StartYear</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
@section Scripts {
@{
<partial name = "_ValidationScriptsPartial" />
<partial name = "_DataTableCDN" />
}
<script>
function runReport() {
var reportData;
var dataTableOptions = {
"paging": true,
"lengthChange": false,
"searching": false,
"ordering": true,
"info": true,
"autoWidth": false,
"responsive": true,
//"columnDefs": "",
"ajax": {
url: "/Reports/ProcessReport",
type: "POST",
data: reportData,
"datatype": "json",
"error": function (e) {
alert(e)
},
"dataSrc": function (d) {
alert(JSON.stringify(d))
return JSON.stringify(d);
//return d;
},
"columns":[
{ "data": "CustomerNumber", "name": "CustomerNumber", "autoWidth":
true },
{ "data": "CustomerStatus", "name": "CustomerStatus", "autoWidth":
true },
{ "data": "StartYear", "name": "StartDate", "autoWidth": true }
]
}
}
reportData = $('#reportForm').serializeArray();
var myDataTable = $('#riskReport').DataTable(dataTableOptions);
}
</script>
Контроллер:
[HttpPost]
public async Task<string> ProcessReport(ReportsConfigurationVM reportsConfigurationVM)
{
List<RiskByYearTest> myList = new List<RiskByYearTest>();
RiskByYearTest r1 = new RiskByYearTest();
r1.CustomerNumber = "4549601";
r1.CustomerStatus = "Active";
r1.StartYear = "2022";
RiskByYearTest r2 = new RiskByYearTest();
r2.CustomerNumber = "4549602";
r2.CustomerStatus = "Closed";
r2.StartYear = "2023";
myList.Add(r1);
myList.Add(r2);
return JsonConvert.SerializeObject(myList);
}
Контроллер возвращает следующие две строки данных.
[
{
"CustomerNumber": "4549601",
"CustomerStatus": "Active",
"StartYear": "2022"
},
{
"CustomerNumber": "4549602",
"CustomerStatus": "Closed",
"StartYear": "2023"
}
]
Однако я получаю это всплывающее сообщение об ошибке, и данные не отображаются в сетке. Пустая сетка говорит: «В таблице нет данных».
Предупреждение DataTables: table id=riskReport — запрошен неизвестный параметр «0» для строки 0, столбец 0. Дополнительную информацию об этой ошибке см. https://datatables.net/tn/4
Хотел добавить: наверное проще, хотя бы для тестирования/чтобы заставить его работать, подтвердить, что дело в проблеме. Везде, где у вас есть CustomerNumber
, измените его на customerNumber
. Если это работает, то это проблема случая, если нет, то это другая проблема. Я подозреваю, что проблема в том, что у вас есть columns:
def в вашем ajax, но нет в определении таблицы. Попробуйте переместить (или скопировать) определение columns
из «ajax:» непосредственно в dataTableOptions
.
Спасибо! Я изменил код своего контроллера, чтобы использовать Newtonsoft для сериализации моих данных. Сейчас дело сохранено. Тем не менее я получаю ту же ошибку.
Затем посмотрите на определение столбцов — в вашем исходном dataTableOptions
нет определения столбцов.
С помощью ajax.dataSrc вы указываете значение с '', указывающее, что ваши данные взяты из простого массива.
columns
не следует размещать в объекте ajax
, но это корневой атрибут того же уровня, что и ajax
.
Структура dataTableOptions
следующая:
var dataTableOptions = {
paging: true,
lengthChange: false,
searching: false,
ordering: true,
info: true,
autoWidth: false,
responsive: true,
//"columnDefs": "",
ajax: {
url: '/Reports/ProcessReport',
type: "POST",
data: reportData,
datatype: 'json',
error: function (e) {
alert(e);
},
dataSrc: '',
},
columns: [
{
data: 'CustomerNumber',
name: 'CustomerNumber',
autoWidth: true,
},
{
data: 'CustomerStatus',
name: 'CustomerStatus',
autoWidth: true,
},
{ data: 'StartYear', name: 'StartDate', autoWidth: true },
],
};
Ошибка datatables — это распространенная ошибка, означающая, что предоставленные данные не совсем соответствуют ожидаемым. Попробуйте настроить параметры сериализатора JSON
PropertyNamingPolicy = null
так, чтобы он не конвертировалCustomerNumber
вcustomerNumber
(и т. д.).