【问题标题】:Why don't jquery datatable get filled with newly updated data after searching?为什么 jquery 数据表在搜索后没有填充新更新的数据?
【发布时间】:2018-02-01 00:39:02
【问题描述】:

我正在从 WebAPI 填充我的 jQuery 数据表(版本:1.10.15)并且它可以工作,但是当我通过搜索框在数据表中搜索时,它不会用更新的数据填充数据表。为什么?

我检查了,它发送搜索值并从服务器带来更新的数据,但没有用新返回的数据填充表。

function show()
{                               
  $('#example').DataTable({
//  "processing": true,
    "serverSide": true,
    "retrieve": true,
    "destroy": true,
    "pagination": true,
//  "contentType": 'application/json; charset=utf-8',
    "ajax": "http://localhost:28071/Users"
  });
}

更新:

C# api 代码:

namespace WebApiHimHer.Controllers
{
    public class UsersController : ApiController
    {
        [HttpGet]
        public DTResult GetData([FromUri]DTParameters v)
        {

            List<string[]> s = new List<string[]>();

            //List<basicoperations> s = new List<basicoperations>();

            basicoperations bo= new basicoperations();


            s = bo.getUsers(v.length, v.start, 1, v.sortOrder, v.search.Value);

            DTResult r = new DTResult();
            r.draw = 1;
            r.recordsFiltered = s.Count;
            r.recordsTotal = 100; ;
            r.data = s;

            return r;
        }
    }

    public class DTResult
    {
        public int draw { get; set; }
        public int recordsTotal { get; set; }
        public int recordsFiltered { get; set; }
        public List<string[]> data { get; set; }
    }
    public abstract class DTRow
    {
        public virtual string DT_RowId
        {
            get { return null; }
        }
        public virtual string DT_RowClass
        {
            get { return null; }
        }
        public virtual object DT_RowData
        {
            get { return null; }
        }
    }
    public class DTParameters
    {
        public int draw { get; set; }
        public DTColumn[] columns { get; set; }
        public DTOrder[] order { get; set; }
        public int start { get; set; }
        public int length { get; set; }
        public DTSearch search { get; set; }
        public string sortOrder
        {
            get
            {
                return columns != null && order != null && order.Length > 0
                    ? (columns[order[0].Column].Data + (order[0].Dir == DTOrderDir.DESC ? " " + order[0].Dir : string.Empty))
                    : null;
            }
        }
    }
    public class DTColumn
    {
        public string Data { get; set; }
        public string Name { get; set; }
        public bool Searchable { get; set; }
        public bool Orderable { get; set; }
        public DTSearch Search { get; set; }
    }
    public class DTOrder
    {
        public int Column { get; set; }
        public DTOrderDir Dir { get; set; }
    }
    public enum DTOrderDir
    {
        ASC,
        DESC
    }
    public class DTSearch
    {
        public string Value { get; set; }
        public bool Regex { get; set; }


    }

}

我在初始表加载和执行搜索后发布请求和响应

初始加载后:

  • 请求:

_ 1503560388132 列[0][数据] 0 列[0][名称] 列[0][可订购] 真的 列[0][搜索][正则表达式] 错误的 列[0][搜索][值] 列[0][可搜索] 真的 列[1][数据] 1 列[1][名称] 列[1][可订购] 真的 列[1][搜索][正则表达式] 错误的 列[1][搜索][值] 列[1][可搜索] 真的 画 2 长度 10 订单[0][列] 0 订单[0][目录] 升序 搜索[正则表达式] 错误的 搜索[价值] 2 开始 0

回复:

{"draw":1,"recordsTotal":4,"recordsFiltered":25,"data":[["Hunain","123"],["hk","asd"], [“丹妮莉丝·坦格利安” ,"123"],["",""]]}

执行搜索后:

  • 请求:

_ 1503560409319 列[0][数据] 0 列[0][名称] 列[0][可订购] 真的 列[0][搜索][正则表达式] 错误的 列[0][搜索][值] 列[0][可搜索] 真的 列[1][数据] 1 列[1][名称] 列[1][可订购] 真的 列[1][搜索][正则表达式] 错误的 列[1][搜索][值] 列[1][可搜索] 真的 画 2 长度 10 订单[0][列] 0 订单[0][目录] 升序 搜索[正则表达式] 错误的 搜索[价值] w 开始 0

  • 回复:

{"draw":1,"recordsTotal":1,"recordsFiltered":25,"data":[["Waleed","123"]]}

【问题讨论】:

  • 没有看到你的服务器端脚本就不可能说。不知何故,数据以不正确的方式发送。
  • @davidkonrad:当然,我正在更新问题
  • @davidkonrad 用服务器代码、ajax 请求和响应更新了问题

标签: javascript jquery css datatables datatables-1.10


【解决方案1】:

原因是发送和接收的draw 参数不一样,因为我在服务器代码中使用了draw 静态所以不匹配。我返回了与发送时相同的draw 参数。


来自docs

此对象响应的抽奖计数器 - 来自抽奖 作为数据请求的一部分发送的参数。请注意,它是强 出于安全原因,建议您将此参数转换为 整数,而不是简单地向客户端回显它发送的内容 draw 参数,以防止跨站点脚本(XSS) 攻击。

【讨论】:

  • 敢于编辑答案:) 请将您自己的答案标记为已接受。感觉它会在未来帮助人们。
  • 很好,感谢您帮助我找到答案。
【解决方案2】:

编辑

    function show(){
        $("#example").DataTable({
            serverSide: true,
            processing: true,       
            columns : [
                { data : 'FirstName' },
                { data : 'LastName' }
            ],    
            ajax: {
                url: "https://api.myjson.com/bins/384sr",
                dataSrc : ''
           }
        });  
   }
   show();

HTML

<table id="example" class="display">
<thead>
    <tr>
        <th>First Name</th>
        <th>Last Name</th>
    </tr>
</thead>

Jsfiddle

【讨论】:

  • 我说的是搜索
  • 用服务器代码、ajax 请求和响应更新了问题
【解决方案3】:

不确定您是否发现了错误,但请检查一下。

验证 applicationhost.config 或 web.config 文件中的 configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryString 设置。

【讨论】:

    【解决方案4】:
    //For me it was two things.
    
    //wrap the table javascript with 
    
    //function _displayItems(data) { var table = $('#...
    
    //Then using the closing brackets:
    //destroy then clear
        productsTable.destroy();
        productsTable.clear();
    }
    
    function _displayItems() {
      fetch(uri)
        .then(response => response.json())
        .then(data => _displayItems(data))
        .catch(error => console.error('Unable to get items.', error));
    }
    
        var tableName = $('#data').DataTable({
            "processing": true,
            "data": data,
            "columns": [
                { "name": "name", "data": "name" },
                { "name": "id", "data": "id" },
                {
                    "render": function (data, type, full, meta) {
                        var buttonID = "edit_" + full.id;
                        return '<a id="' + buttonID + '" class="btn btn-outline-info waves-effect editBtn" role="button">Edit</a>';
                    }
                },
                {
                    "render": function (data, type, full, meta) {
                        var buttonID = "delete_" + full.id;
                        return ' <a id="' + buttonID + '" onclick="deleteUserRoleModal()" type="button" class="btn btn-outline-danger waves-effect removeRole" role="button">Delete</a>';
                    }
                }
            ],
            "responsive": true,
            "dom": 'Bfrtip',
            "buttons": [
                'copy', 'excel', 'pdf',
                {
                    text: 'Delete',
                }
            ],
            "initComplete": function () {
                this.api().columns([0]).every(function () {
                    var column = this;
                    var select = $('<select class="selectpicker" data-size="5" data-live-search="true"><option value="">Application Role (All)</option></select>')
                        .appendTo("#table").end()
                        .on('change', function () {
                            var val = $.fn.dataTable.util.escapeRegex(
                                $(this).val()
                            );
    
                            column
                                .search(val ? '^' + val + '$' : '', true, false)
                                .draw();
                        });
    
                    column.cells('', column[0]).render('display').sort().unique().each(function (d, j) {
                        if (column.search() === '^' + d + '$') {
                            select.append('<option value="' + d + '" selected="selected">' + d + '</option>')
                        }
                        else {
                            select.append('<option value="' + d + '">' + d + '</option>')
                        }
                    });
                });
            },
    
            "bJqueryUI": true,
            "bPaginate": false,
            "aaSorting": [[1, 'asc']],
            "aoPreSearchCols": [[1]],
    
            "lengthMenu": [
                [12, 24, 48, 1000],
                ['12', '24', '48', 'all']
            ],
            "language": {
                searchPlaceholder: "? Role Screen ",
                search: " ",
            }
        });
    
        $.fn.dataTable.Buttons(productsTable, {
            buttons: [
                'copy', 'excel', 'pdf'
            ]
        });
        productsTable.buttons().container()
            .appendTo($('.col-sm-6:eq(0)', productsTable.table().container()));
        $("#todos" + "#table").DataTable({
            responsive: true
        });
    
        //destroy then clear
        productsTable.destroy();
        productsTable.clear();
    }
    
    
    
      
     
        
     
    
         
    

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 2019-10-24
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2017-11-13
      • 1970-01-01
      相关资源
      最近更新 更多