我从数据插入式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)
这是我这样做的方式。使用帖子而不是Web服务的GET,我取得了更大的成功。另外,由于您的Web服务正在序列化(我以同样的方式进行(JSON对象最终会序列化两次。另外,数据表期望数据以{数据:[您的数据]}的形式,并且Web服务返回{D:[您的数据序列化]}您必须进行调整客户端。这是我的方式。
$(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"}]
});
});
我从上面的代码中进行了更改,我使用datatable而不是数据集进行了更改。
此用于序列化数据的代码
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/9bfl34/3-ways-to-conter-to-convert-datatable-to-json-string-in-string-in-string-in-asp-net-c-net-c-sharp/p-sharp/pe/p>
服务器端处理,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"}]
});
});