为啥 jquery 数据表在搜索后没有填充新更新的数据?

Posted

技术标签:

【中文标题】为啥 jquery 数据表在搜索后没有填充新更新的数据?【英文标题】: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 请求和响应更新了问题 【参考方案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();




  
 
    
 

     

【讨论】:

以上是关于为啥 jquery 数据表在搜索后没有填充新更新的数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Bindinglist 在数据库更改后不更新?

Rails - 为啥远程提交我的表单后 jQuery 不加载

在 JQuery 自动完成填充输入字段后调用新函数

为啥动态值没有填充在自动完成组合框中?

为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象

为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象