jQuery数据表未填充

Posted

技术标签:

【中文标题】jQuery数据表未填充【英文标题】:jQuery datatable not populating 【发布时间】:2018-06-15 15:42:06 【问题描述】:

我有一个 jQuery 数据表,通过 Web 服务 API 获取数据。我可以看到返回的数据格式正确,但表格没有显示数据。

我有一个“提交”按钮,单击该按钮可获取数据并重绘表格。我在“成功”函数中放了一个断点,可以看到json数据。

aspx 页面顶部的 javascript 和数据表定义(我需要这个 js 函数,因为数据表顶部的搜索文本框在页面重新加载时不断消失)

<script>
    $(function () 
        bindDataTable(); // bind data table on first page load
        // bind data table on every UpdatePanel refresh
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(bindDataTable);
    );

    function bindDataTable() 
        var FacCertDT = $('#tblFacCert').DataTable(
            'bDestroy': true,
            "bStateSave": true,
            dom: 'lfrtip',
            "fnStateSave": function (oSettings, oData) 
                localStorage.setItem('tblFacCert', JSON.stringify(oData));
            ,
            "fnStateLoad": function (oSettings) 
                return JSON.parse(localStorage.getItem('tblFacCert'));
            
        );
    
</script>

<div runat="server" id="divFacCert" ClientIDMode="Static" style="padding:15px">
    <div class="table-responsive">
        <table id="tblFacCert" class="table table-striped table-bordered table-hover">
            <thead>
                <tr class="info">
                    <th>Area</th>
                    <th>District</th>
                    <th>MPOO </th>
                    <th>Facility</th>
                    <th>Type</th>
                    <th>Sub-Type</th>
                    <th>Response Due Date</th>
                    <th>Completed?</th>
                    <th>Completed By</th>
                    <th>Completed On</th>
                </tr>
            </thead>
        </table>
    </div>
</div>

页面底部的Javascript:

<script>
    Table = $("#tblFacCert").DataTable(
        data: [],
        "aoColumns": [
            
                "mData": "Area"
            , 
                "mData": "District"
            , 
                "mData": "MPOO"
            , 
                "mData": "FacilityName"
            , 
                "mData": "FacilityType"
            , 
                "mData": "FacilitySubType"
            , 
                "mData": "ResponseDueDate"
            , 
                "mData": "Completed"
            , 
                "mData": "UserName"
            , 
                "mData": "ResponseDate"
            
        ],
        "pageLength": 15,
        "deferRender": true,
        rowCallback: function (row, data)  ,
        filter: false,
        info: false,
        ordering: false,
        processing: true,
        retrieve: true
    );

    $("#btnSubmit").on("click", function (event) 
        $.ajax(
            type: "POST",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            url: "../services/easg.asmx/GetComplianceReportData",
            cache: false,
            contentType: "application/json; charset=utf-8",
            data: " 'startDate': '" + $("#tbStartDate").val() + "', 'certID': '" + $('#ddlCertificate').val() + "'"
        ).done(function (result) debugger
            Table.clear().draw();
            Table.rows.add(result).draw();
            ).fail(function (jqXHR, textStatus, errorThrown) 
                alert(textStatus + ' - ' + errorThrown);
        );
    )
</script>

这是 Web 服务 API 的样子:

namespace FacCert

    /// <summary>
    /// Summary description for easg
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]

    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService]
    public class easg : System.Web.Services.WebService
    

        [WebMethod]
        [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]

        public string GetComplianceReportData(string startDate, string certID)
        
            DateTime dtStartDate = Convert.ToDateTime(startDate);
            int iCertItemID = int.Parse(certID);
            DataTable dt = FacCompliance.GetFacCompliances(dtStartDate, iCertItemID);
            string JSONresult;
            JSONresult = JsonConvert.SerializeObject(dt);
            return JSONresult;
        
    

这是我在 "on("click")" 中检查时的数据:

[
    
        "Area":"CAPITAL METRO (K)",
        "District":"NORTHERN VIRGINIA",
        "MPOO":"Plant",
        "FacilityName":"DULLES VA P&DC",
        "FacilityType":"Network Operations",
        "FacilitySubType":"P&DC",
        "ResponseDueDate":"2017-12-20T00:00:00",
        "ResponseDate":"2017-12-30T17:57:35.353",
        "UserACEID":"XXXXXX",
        "UserName":"John Doe",
        "Completed":"Yes",
        "AreaID":11,
        "DistrictID":58,
        "FacID":2261,
        "FacComplianceID":1
    ,
        "Area":"CAPITAL METRO (K)",
        "District":"NORTHERN VIRGINIA",
        "MPOO":"Plant",
        "FacilityName":"NORTHERN VA P&DC",
        "FacilityType":"Network Operations",
        "FacilitySubType":"P&DC",
        "ResponseDueDate":"2017-12-20T00:00:00",
        "ResponseDate":"2017-12-30T18:23:10.86",
        "UserACEID":"XXXXXX",
        "UserName":"John Doe",
        "Completed":"Yes",
        "AreaID":11,
        "DistrictID":58,
        "FacID":2262,
        "FacComplianceID":4
    
]

我已经搜索并尝试了所有建议,但似乎没有任何解决问题的方法。我希望这里的人能看到我在哪里搞砸了。

API 返回的一些列我没有包含在数据表中(例如 AreaID、DistrictID...)。

更新:

如果我替换 Table.rows.add(result).draw() 中的变量“result”;使用我在帖子中列出的实际 json 数组,然后显示数据。我通过放置一个断点并检查“结果”的值来获取 json 数据,所以我不确定为什么它在我使用实际的 json 数据而不是当我传递它“结果”时起作用。

【问题讨论】:

您能否添加ajax 调用返回的数据的示例字符串,另外您应该以json 格式返回数据,请参阅here 我已经更新了问题并添加了返回的数据和网络服务API。 代码或数据绝对没有问题,它可以立即运行 -> jsfiddle.net/00t2m3bx 所以你的问题出在其他地方...... 【参考方案1】:

在您的 Ajax done 方法中替换这一行:

Table.rows.add(JSON.parse(result.d)).draw();

编辑 如果您使用的是更新面板,您可以将您的 js 方法与它绑定,然后您的更改就会反映。将您的按钮提交代码放在函数中并将您的方法名称设置为参数。我希望它能工作

<script type="text/javascript">
  Sys.WebForms.PageRequestManager.getInstance().add_endRequest(YourMethod);
    </script>

【讨论】:

会不会是因为 FacilityName 包含 '&' 字符? 不,与符号&amp; 字符在字符串值中有效。我测试了你发布的数据,它适用于这个答案。 错误建议,因为结果已经是 JSON 格式。这是由dataType: "json" 确保的...这就是为什么JSON.parse() 抛出“无效字符”错误,它得到一个文字 - 而不是它应该的字符串... 好的,至少我知道表和数据设置是正确的。数据表在更新面板中;那会有什么不同吗?有什么建议我应该看的吗?这是我的第一个 jQuery 数据表。 我错过了在页面上添加几个 js 函数来解决页面重新加载时“搜索”文本框消失的问题。为了完整起见,我将其包括在内,以防万一......【参考方案2】:

在花了很多时间之后,我弄清楚了问题所在。当我将实际的 json 数据传递给 Table.rows.add() 时,会显示数据。所以我知道我传递的“结果”参数有问题。当我查看 Chrome 中返回的响应时,我注意到它正在向其中添加 XML 标记:

<string xmlns="http://tempuri.org/">
[
    
        "Area":"CAPITAL METRO (K)",
        "District":"NORTHERN VIRGINIA",
        ....
    
]
</string>

这就是为什么会显示原始数据,但在我将“结果”参数传递给它时不会显示的原因。

解决方法是像这样更改按钮单击功能:

$("#btnSubmit").on("click", function (event) 
    $.ajax(
        type: "POST",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        url: "../services/easg.asmx/GetComplianceReportData",
        cache: false,
        data: " 'startDate': '" + $("#tbStartDate").val() + "', 'certID': '" + $('#ddlCertificate').val() + "'"
    ).done(function (result) 
        Table.clear().draw();
        jResult = JSON.parse(result.d); <--- This is the fix
        Table.rows.add(jResult).draw();
    ).fail(function (jqXHR, textStatus, errorThrown) 
        alert(textStatus + ' - ' + errorThrown);
    );
)

【讨论】:

以上是关于jQuery数据表未填充的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 3 中,Jquery 令牌输入未填充数据库中的值

在 Javascript 文件中使用 jQuery.each() 时,下拉列表中未填充数组中的数据

来自 JQuery 填充字段的值未绑定到 MVC 模型

JSON 数据发布但表格未填充

jquery Ajax 调用 - 数据参数未传递给 MVC 控制器操作

回发后未调用模态对话框的 onshow