开发者问题收集

Datatable Jquery 插件实现

2017-04-26
570

我不断从 datatable Jq 插件收到“无效的 json 响应”, 我正在发布我的 webmethod 和 HTML 结构以及 AJAX 调用, 我怀疑我的 web 方法没有正确序列化为 JSON 格式,但当我测试格式时,我发现它有效( http://jsonlint.com/ )。我无法找出这里的问题

  <WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=False, XmlSerializeString:=False)> _
Public Function SrcTblRegx()
    Dim constr As String = ConfigurationManager.ConnectionStrings("ARTSQLConStrng").ConnectionString
    Using con As New SqlConnection(constr)
        Using cmd As New SqlCommand("TblRegSearchx", con)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Connection = con
            Dim ds As New DataSet()
            Using sda As New SqlDataAdapter(cmd)
                sda.Fill(ds)
            End Using
            Dim jsondata As String = JsonConvert.SerializeObject(ds)
            Return jsondata
        End Using
    End Using
End Function

Webmethod 输出为

<anyType xmlns:q1="http://www.w3.org/2001/XMLSchema" xmlns:d1p1="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/" d1p1:type="q1:string">
{"Table":[{"Filenum":15112777,"FullName":"marwam saleh moh saleem","DOB":"2015-11-26T00:00:00"}]}
</anyType>
<table id="RegSrc2" class="table table-bordered table-striped">
                            <thead>
                                <tr>
                                    <th><b>File Number</b></th>
                                    <th><b>Patient Name</b></th>
                                    <th><b>DOB</b></th>
                                </tr>

                            </thead>
                            <tbody></tbody>
                            <tfoot>
                                <tr>
                                    <th><b>File Number</b></th>
                                    <th><b>Patient Name</b></th>
                                    <th><b>DOB</b></th>
                                </tr>
                            </tfoot>
                        </table>

 $(document).ready(function () {
                    var $table = $('#RegSrc2');
                    $table.dataTable({
                        bProcessing: true,
                        "serverSide": true,
                        "sAjaxSource": $table.data('../CONFIG/WebSerTblsSearch.asmx/SrcTblRegx'),
                    })
                });

我也在添加我的 web 浏览器错误

jquery.dataTables.js:3929 Uncaught TypeError: Cannot set property 'data' of null
    at _fnBuildAjax (jquery.dataTables.js:3929)
    at _fnAjaxUpdate (jquery.dataTables.js:3946)
    at _fnDraw (jquery.dataTables.js:3409)
    at _fnReDraw (jquery.dataTables.js:3528)
    at _fnInitialise (jquery.dataTables.js:4710)
    at loadedInit (jquery.dataTables.js:1320)
    at HTMLTableElement.<anonymous> (jquery.dataTables.js:1332)
    at Function.each (jquery-2.1.4.js:374)
    at jQuery.fn.init.each (jquery-2.1.4.js:139)
    at jQuery.fn.init.DataTable [as dataTable] (jquery.dataTables.js:869)
2个回答

这是我的方法。对于 Web 服务,我使用 post 比 get 更成功。此外,由于您的 Web 服务正在序列化(我以相同的方式执行),json 对象最终会被序列化两次。此外,数据表期望数据采用 {data: [your data] } 的形式,而 Web 服务返回 {d:[your data serialized]},因此您必须在客户端进行调整。这是我的方法。

    $(document).ready(function () {

        $('#example').DataTable({

            "processing": false,
            // since you are getting all the data at once set serverSide to
            // false, otherwise using the built in search and paging will trigger
            // more ajax calls to get the same data.
            "serverSide": false,
            "ajax": {

                // returning the data from the server as json data
                contentType: "application/json; charset=utf-8",
                // assuming your url is right....
                url: "../CONFIG/WebSerTblsSearch.asmx/SrcTblRegx",
                type: "Post",

             // You are not sending parameters to the server so next line commented out
                data: function (dtParms) { 
                    return  JSON.stringify({ SrchTxt: "your search string" }); 
                },
                dataFilter: function (res) {

                    // do what you need to the data before it loads to the table
                    // first deserialization
                    var parsed = JSON.parse(res);
                   // now you can access the data in d and deserialize that
                    var morp = JSON.parse(parsed.d);

                    // reserialize to what datatables expect.
                    return JSON.stringify( { data: morp });
                },
                error: function (x, y) {

                    console.log(x);

                }
            },
            columns:[
                {data:"Filenum"},
                {data: "FullName"},
                {data:"DOB"}]

        });

    });
Bindrid
2017-04-27

我对上面的代码进行了更改,我使用的是数据表而不是数据集。

此代码用于序列化数据表

Public Function DataTableToJSONWithJavaScriptSerializer(table As DataTable) As String
    Dim jsSerializer As New JavaScriptSerializer()
    Dim parentRow As New List(Of Dictionary(Of String, Object))()
    Dim childRow As Dictionary(Of String, Object)
    For Each row As DataRow In table.Rows
        childRow = New Dictionary(Of String, Object)()
        For Each col As DataColumn In table.Columns
            childRow.Add(col.ColumnName, row(col))
        Next
        parentRow.Add(childRow)
    Next
    Return jsSerializer.Serialize(parentRow)
End Function

参考: http://www.c-sharpcorner.com/UploadFile/9bff34/3-ways-to-convert-datatable-to-json-string-in-Asp-Net-C-Sharp/

服务器端处理,webmethod(存储过程)

<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
       Public Function SrcTblReg(ByVal SrchTxt As String)
        
        Dim constr As String = ConfigurationManager.ConnectionStrings("ARTSQLConStrng").ConnectionString
    Using con As New SqlConnection(constr)
        Using cmd As New SqlCommand("TblRegSearch", con)
            cmd.CommandType = CommandType.StoredProcedure
            If (String.IsNullOrEmpty(SrchTxt)) Then
                cmd.Parameters.Add("@Searchtxt", SqlDbType.NVarChar).Value = DBNull.Value
            Else
                cmd.Parameters.Add("@Searchtxt", SqlDbType.NVarChar).Value = SrchTxt.Trim()
            End If
                cmd.Connection = con
                Using sda As New SqlDataAdapter(cmd)
                    Dim dt As New DataTable()
                    sda.Fill(dt)
                    Dim sJSON = DataTableToJSONWithJavaScriptSerializer(dt)
                    Return sJSON
                End Using
                'Dim jsondata As String = JsonConvert.SerializeObject(ds)
                'Return jsondata
            End Using
        End Using
    End Function

最后由 Bindrid 提供的客户端。

$(document).ready(function () {

    $('#example').DataTable({

        "processing": false,
        // since you are getting all the data at once set serverSide to
        // false, otherwise using the built in search and paging will trigger
        // more ajax calls to get the same data.
        "serverSide": false,
        "ajax": {

            // returning the data from the server as json data
            contentType: "application/json; charset=utf-8",
            // assuming your url is right....
            url: "../CONFIG/WebSerTblsSearch.asmx/SrcTblRegx",
            type: "Post",

         // You are not sending parameters to the server so next line commented out
            data: function (dtParms) { 
                return  JSON.stringify({ SrchTxt: "your search string" }); 
            },
            dataFilter: function (res) {

                // do what you need to the data before it loads to the table
                // first deserialization
                var parsed = JSON.parse(res);
               // now you can access the data in d and deserialize that
                var morp = JSON.parse(parsed.d);

                // reserialize to what datatables expect.
                return JSON.stringify( { data: morp });
            },
            error: function (x, y) {

                console.log(x);

            }
        },
        columns:[
            {data:"Filenum"},
            {data: "FullName"},
            {data:"DOB"}]

    });

});
JSON
2017-04-27