Как отобразить данные в таблице данных jQuery в ASP.NET Core MVC при событии нажатия кнопки

Я новичок в таблицах данных 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

Ошибка datatables — это распространенная ошибка, означающая, что предоставленные данные не совсем соответствуют ожидаемым. Попробуйте настроить параметры сериализатора JSON PropertyNamingPolicy = null так, чтобы он не конвертировал CustomerNumber в customerNumber (и т. д.).

fdomn-m 20.08.2024 17:07

Хотел добавить: наверное проще, хотя бы для тестирования/чтобы заставить его работать, подтвердить, что дело в проблеме. Везде, где у вас есть CustomerNumber, измените его на customerNumber. Если это работает, то это проблема случая, если нет, то это другая проблема. Я подозреваю, что проблема в том, что у вас есть columns: def в вашем ajax, но нет в определении таблицы. Попробуйте переместить (или скопировать) определение columns из «ajax:» непосредственно в dataTableOptions.

fdomn-m 20.08.2024 17:34

Спасибо! Я изменил код своего контроллера, чтобы использовать Newtonsoft для сериализации моих данных. Сейчас дело сохранено. Тем не менее я получаю ту же ошибку.

Massey 20.08.2024 17:48

Затем посмотрите на определение столбцов — в вашем исходном dataTableOptions нет определения столбцов.

fdomn-m 20.08.2024 17:51
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. С помощью ajax.dataSrc вы указываете значение с '', указывающее, что ваши данные взяты из простого массива.

  2. 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 },
  ],
};

Демо (с высмеянным запросом) @ StackBlitz

Другие вопросы по теме