【问题标题】:DataTable how to get data from AJAXDataTable如何从AJAX获取数据
【发布时间】:2023-03-11 22:25:01
【问题描述】:

我一直在学校里制作 CRUD 表,传统上是通过每页脚手架来制作的,我想试试我是否可以在不使用 Partial View 的情况下完成所有操作。我选择使用 AJAX,我在这里遵循了指南:https://dzone.com/articles/crud-operation-in-aspnet-mvc-using-ajax-and-bootst

一切都完美无缺,但我想使用 DataTable API 将搜索和排序功能添加到表中。这就是桌子的样子 HERE.

如您所见,它无法识别来自我制作的 JS 的数据,最明显的是“显示 0 到 0 个条目,共 0 个条目”。有没有办法将数据从 AJAX 加载到 DataTable 脚本?非常感谢!我将在下面提供我的代码。

编辑:我将 DataTable 初始化放在 Inventory.js 中,DataTable 有时会在页面加载时工作。尝试多次刷新页面时非常随机。我尝试在页面加载之前延迟,看看这是否有任何区别,但它不起作用。有人知道发生了什么吗?

库存(型号)

    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>
}

【问题讨论】:

  • 我猜您的创建日期和上次修改日期是非标准日期格式。介意分享输出以查看其实际格式吗? datatables.net/forums/discussion/45692/…
  • 嗨 ghitesh!我认为您误读了标题,但数据显示在表格上,但 DataTable 无法识别数据,如我链接的图片所示 link

标签: javascript json ajax asp.net-mvc datatables


【解决方案1】:

我正在使用 1.10 Jquery 数据表,而对于模板,我正在使用 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;
        }

【讨论】:

  • 我可以假设,OP 正在开发他自己的应用程序,而不是你的。所以,我猜测与上下文几乎没有共同之处的无关代码块,在原始帖子中描述(从serverSide: true开始,一堆你自己的类和AJAX方法'POST'而不是OP代码中的'GET' ),没用。你不觉得吗?
【解决方案2】:

感谢您的帮助。我让它与我在同一个论坛上找到的帖子保持一致。

我更改了获取数据的代码。显然你需要附加数据,这是让我的 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
            }]               
        });

再次感谢您!

【讨论】:

  • 您应该在您的生产应用程序中使用该方法,尽管通过异步 AJAX 响应和 DataTables 初始化(我之前在我的帖子中提到过)解决了您的问题,您一直在做一些错误或次优的事情:主要问题是您在每次 AJAX 调用时不必要地销毁和创建 DataTable,这会浪费性能,相反,您应该使用 ajax 选项(如在我的帖子),这将消除另一个(次要)副作用 - 现在,您无法通过 DataTables API 访问 AJAX 响应数据。
  • 另一个不足之处是您自己完成了所有繁重的 HTML 工作,这根本没有意义(加载库并使用额外的代码行重载您自己的脚本以重新发明功能已经到位)。顺便说一句,如果列数更多,您的做法可能会让人头疼。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2017-07-30
  • 2018-08-05
  • 1970-01-01
  • 2022-01-09
  • 2010-11-23
相关资源
最近更新 更多