DataTable, как получить данные из AJAX - PullRequest
0 голосов
/ 14 апреля 2019

В школе я традиционно создавал таблицы CRUD с помощью скаффолдинга на страницу и хотел попробовать, смогу ли я выполнять все операции без использования Partial View. Я решил использовать AJAX, следуя инструкциям здесь: https://dzone.com/articles/crud-operation-in-aspnet-mvc-using-ajax-and-bootst

Все работает безупречно, но я хотел использовать DataTable API для добавления функций поиска и сортировки в таблицу. Вот как выглядит стол ЗДЕСЬ .

Как вы можете видеть, он не распознает данные, поступившие от JS, которые я сделал, особенно с «Показом от 0 до 0 из 0 записей». Есть ли способ загрузить данные из AJAX в сценарий DataTable? Спасибо большое! Я предоставлю свой код ниже.

РЕДАКТИРОВАТЬ: Я помещаю инициализацию DataTable в Inventory.js, и ИНОГДА DataTable работает при загрузке страницы. Это очень случайно при попытке обновить страницу несколько раз. Я попытался установить задержку перед загрузкой страницы, чтобы понять, имеет ли это какое-то значение, но она не работает. Кто-нибудь знает, что происходит?

Inventory (модель)

    public List<Inventory> ListAll()
    {
        List<Inventory> lst = new List<Inventory>();
        using (SqlConnection con = new SqlConnection(Helper.GetCon()))
        {
            con.Open();
            string query = @"SELECT * FROM Inventory";
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                            lst.Add(new Inventory
                        {   
                            InventoryId = Convert.ToInt32(dr["inv_id"]),
                            Category = Helper.Decrypt(dr["category_name"].ToString()),
                            Name = Helper.Decrypt(dr["item_name"].ToString()),
                            Details = Helper.Decrypt(dr["item_details"].ToString()),
                            Quantity = Convert.ToInt32(dr["quantity"]),
                            CsbCode = Helper.Decrypt(dr["csb_code"].ToString()),
                            Notes = Helper.Decrypt(dr["notes"].ToString()),
                            Location = Helper.Decrypt(dr["location"].ToString()),
                            DateCreated = DateTime.Parse(dr["date_created"].ToString()),
                            LastModified = DateTime.Parse(dr["last_modified"].ToString()),
                        });
                    }
                    return lst;
                }                 
            }

        }
    }

InventoryController.cs

 public JsonResult List()
    {
        return Json(invDB.ListAll(), JsonRequestBehavior.AllowGet);
    }

Inventory.js (Как я получаю свои данные)

function loadData() {
$.ajax({
    url: "/Inventory/List",
    type: "GET",
    contentType: "application/json;charset=utf-8",
    dataType: "json",
    success: function (result) {
        var html = '';
        $.each(result, function (key, item) {
            html += '<tr>';
            html += '<td>' + item.InventoryId + '</td>';
            html += '<td>' + item.Category + '</td>';
            html += '<td>' + item.Name + '</td>';
            html += '<td>' + item.Details + '</td>';
            html += '<td>' + item.Quantity + '</td>';
            html += '<td>' + item.CsbCode + '</td>';
            html += '<td>' + item.Notes + '</td>';
            html += '<td>' + item.Location + '</td>';
            html += '<td>' + dateTimeFormat(item.DateCreated) + '</td>';
            html += '<td>' + dateTimeFormat(item.LastModified) + '</td>';
            html += '<td><a href="#" onclick="return getbyID(' + item.InventoryId + ')">Edit</a> | <a href="#" onclick="Delele(' + item.InventoryId + ')">Delete</a></td>';
            html += '</tr>';
        });
        $('.tbody').html(html);
    },
    error: function (errormessage) {
        alert(errormessage.responseText);
    }
});

} * * тысяча двадцать-один

Индекс (скрипт DataTable):

    @section scripts {
    <script src="https://cdn.datatables.net/1.10.19/js/dataTables.uikit.min.js"></script>
    <script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
    <script src="https://cdn.datatables.net/buttons/1.5.6/js/dataTables.buttons.min.js"></script>
    <script src="https://cdn.datatables.net/buttons/1.5.6/js/buttons.print.min.js"></script>
    <script>
        $(document).ready(function () {
            $('#user').DataTable({
                dom: 'Bfrtip',
                buttons: [
                    'print'
                ]

            });
        });
    </script>
}

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

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

Я изменил свой код для получения моих данных к этому. Очевидно, вам нужно добавить данные, это было самым важным, что заставило мои DataTables работать.

$ ("# user tbody"). Append (html);

 $.ajax({
    url: "/Artwork/List",
    type: "GET",
    contentType: "application/json;charset=utf-8",
    dataType: "json",
    success: function (result) {

        $.each(result, function (key, item) {
            var html = '';
            html += '<tr>';
            html += '<td>' + item.ArtID + '</td>';
            html += '<td>' + item.Name + '</td>';
            html += '<td>' + item.Details + '</td>';
            html += '<td>' + item.Location + '</td>';
            html += '<td>' + item.Notes + '</td>';          
            html += '<td>' + dateTimeFormat(item.DateCreated) + '</td>';
            html += '<td>' + dateTimeFormat(item.LastModified) + '</td>';
            html += '<td><a href="#" onclick="return getbyID(' + item.ArtID + ')">Edit</a> | <a href="#" onclick="Delele(' + item.ArtID + ')">Delete</a></td>';
            html += '</tr>';
            $("#user tbody").append(html);
        });
        $('#user').DataTable({
            destroy: true,              
            dom: 'Bfrtip',
            buttons: [
                {
                    extend: 'print',
                    exportOptions: {
                        columns: ':visible' ,
                    }
                },
                'colvis'
            ],
            columnDefs: [{
                visible: false
            }]               
        });

Еще раз спасибо!

0 голосов
/ 15 апреля 2019

Я использую 1.10 Jquery Datatables и для шаблонов я использую Underscore JS.

Вот мой код для загрузки со стороны сервера.

Поместите этот шаблон и таблицу в ваш HTML-код.

<table class="table table-bordered table-condensed" id="tblAccounts"></table>

<script type="text/template" id="tmpl_Grid">
    <td><%= Id %></td>
    <td><%= Amount %></td>
    <td><%= Date %></td>
    <td><%= Type %></td>        
</script>

Затем этот метод для js загружает данные со стороны сервера.

function  Load() {
            var tmpl = _.template($('#tmpl_Grid').html());
            $('#tblAccounts').DataTable({
                "dom": "<'row'<'col-md-6 col-sm-12'l><'col-md-6 col-sm-12'f>r>t<'row'<'col-md-5 col-sm-12'i><'col-md-7 col-sm-12'p>>",
                "paging": true,
                "info": true,
                "ordering": true,
                "search": true,
                "processing": true,
                "serverSide": true,
                "destroy": true,
                "ajax": {
                    "url": "/Accounts/LoadList",
                    "type": "POST",
                    "data": function (d) {
                        d.startDate = $("#txtStartDate").val();
                        d.endDate = $("#txtEndDate").val();
                    }
                },
                "columns": [
                    { "data": null, "title": "ID", "className": "", "orderable": false, "searchable": false },
                    { "data": null, "title": "AMOUNT", "className": "", "orderable": false, "searchable": false },
                    { "data": null, "title": "DATE", "className": "", "orderable": false, "searchable": false },
                    { "data": null, "title": "TYPE", "className": "", "orderable": false, "searchable": false }
                ],
                "order": [[0, "asc"]],
                "rowCallback": function (row, data) {
                    $(row).html(tmpl(data));
                },
                "initComplete": function (settings, json) {

                }
            });
        }

Вот код для контроллера.Я использую EntityFrameword для обработки базы данных, вы можете использовать свой собственный метод или технику.

[HttpPost]
        public async Task<JsonResult> LoadList(string startDate, string endDate)
        {
           var search = Request.Form["search[value]"] + "";

            var totalCount = 0;
            var fList = _context.Expenses.Include(x => x.AccountType).AsQueryable();
            if (!string.IsNullOrEmpty(search))
            {
                fList = fList.Where(x => x.Description.ToLower().Trim().Contains(search.ToLower().Trim()));
            }

            var list = await fList.OrderByDescending(x => x.Id).Skip(start).Take(length).Select(x => new
            {
                x.Id,
                x.Amount,
                Date = x.Date != null ? x.Date.Value.ToString("dd-MMM-yyyy") : "",
                Type = x.AccountTypeId != null ? x.AccountType.Name : "",
                x.Description,
                x.BillAmount,
                x.Payment,
                x.AccountTypeId
            }).ToListAsync();

            if (list.Any())
            {
                totalCount = fList.Count();
            }

            var result = JObject.FromObject(new
            {
                draw,
                recordsFiltered = totalCount,
                recordsTotal = totalCount,
                data = list
            });
            return result;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...