jQuery DataTables服务器端处理和ASP.Net
我正在尝试使用jQuery Datatables插件的服务器端功能与ASP.Net。 ajax请求正在返回有效的JSON,但表中没有显示任何内容。jQuery DataTables服务器端处理和ASP.Net
我最初遇到了我在ajax请求中发送的数据问题。我收到了“无效的JSON主要性”错误。我发现数据需要使用字符串而不是JSON序列化,如本文所述:http://encosia.com/2008/06/05/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/。我不太知道如何解决这个问题,所以我想在Ajax请求添加此:
"data": "{'sEcho': '" + aoData.sEcho + "'}"
如果aboves最终的作品,我会在以后添加其他参数。现在我只是试图让我的桌子上出现一些东西。
返回的JSON看起来不错并且验证,但是帖子中的sEcho是未定义的,我认为这就是为什么没有数据被加载到表中。
那么,我做错了什么?我是否在正确的轨道上,或者我是愚蠢的?有没有人遇到过这个或有任何建议?
这里是我的jQuery:
$(document).ready(function()
{
$("#grid").dataTable({
"bJQueryUI": true,
"sPaginationType": "full_numbers",
"bServerSide":true,
"sAjaxSource": "GridTest.asmx/ServerSideTest",
"fnServerData": function(sSource, aoData, fnCallback) {
$.ajax({
"type": "POST",
"dataType": 'json',
"contentType": "application/json; charset=utf-8",
"url": sSource,
"data": "{'sEcho': '" + aoData.sEcho + "'}",
"success": fnCallback
});
}
});
});
HTML:
<table id="grid">
<thead>
<tr>
<th>Last Name</th>
<th>First Name</th>
<th>UserID</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="5" class="dataTables_empty">Loading data from server</td>
</tr>
</tbody>
</table>
WEBMETHOD:
<WebMethod()> _
Public Function ServerSideTest() As Data
Dim list As New List(Of String)
list.Add("testing")
list.Add("chad")
list.Add("testing")
Dim container As New List(Of List(Of String))
container.Add(list)
list = New List(Of String)
list.Add("testing2")
list.Add("chad")
list.Add("testing")
container.Add(list)
HttpContext.Current.Response.ContentType = "application/json"
Return New Data(HttpContext.Current.Request("sEcho"), 2, 2, container)
End Function
Public Class Data
Private _iTotalRecords As Integer
Private _iTotalDisplayRecords As Integer
Private _sEcho As Integer
Private _sColumns As String
Private _aaData As List(Of List(Of String))
Public Property sEcho() As Integer
Get
Return _sEcho
End Get
Set(ByVal value As Integer)
_sEcho = value
End Set
End Property
Public Property iTotalRecords() As Integer
Get
Return _iTotalRecords
End Get
Set(ByVal value As Integer)
_iTotalRecords = value
End Set
End Property
Public Property iTotalDisplayRecords() As Integer
Get
Return _iTotalDisplayRecords
End Get
Set(ByVal value As Integer)
_iTotalDisplayRecords = value
End Set
End Property
Public Property aaData() As List(Of List(Of String))
Get
Return _aaData
End Get
Set(ByVal value As List(Of List(Of String)))
_aaData = value
End Set
End Property
Public Sub New(ByVal sEcho As Integer, ByVal iTotalRecords As Integer, ByVal iTotalDisplayRecords As Integer, ByVal aaData As List(Of List(Of String)))
If sEcho <> 0 Then Me.sEcho = sEcho
Me.iTotalRecords = iTotalRecords
Me.iTotalDisplayRecords = iTotalDisplayRecords
Me.aaData = aaData
End Sub
返回的JSON:
{"__type":"Data","sEcho":0,"iTotalRecords":2,"iTotalDisplayRecords":2,"aaData":[["testing","chad","testing"],["testing2","chad","testing"]]}
我将数据更改为
"data": "{'sEcho': '"+ aoData[0].value + "'}",
它工作。所以现在的问题是如何将其余的数据传递给web服务。我尝试使用JSON2将JSON转换为一个字符串,但是这打开了另一个蠕虫的罐头,并且是一个单独的问题。
我一直在做同样的事情,我的一个朋友帮助了我这部分。这段代码是用C#编写的,但你应该可以将它移植过来。
jQuery代码:
<script type="text/javascript">
$(document).ready(function() {
function renderTable(result) {
var dtData = [];
// Data tables requires all data to be stuffed into a generic jagged array, so loop through our
// typed object and create one.
$.each(result, function() {
dtData.push([
this.FirstName,
this.LastName,
this.Sign
]);
});
$('#grid').dataTable({
'aaData': dtData,
"bJQueryUI": true
});
}
// Make an AJAX call to the PageMethod in the codebehind
$.ajax({
url: '<%= Request.Url.AbsolutePath %>/ServerSideTest',
data: '{}',
type: 'POST',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function(result) {
// Call the renderTable method that both fills the aaData array with data and initializes the DataTable.
renderTable(result.d);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest + ": " + textStatus + ": " + errorThrown);
}
});
});
</script>
ASPX代码:
<table id="grid" width="100%">
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Sign</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="5" class="dataTables_empty">Loading data from server</td>
</tr>
</tbody>
</table>
后面的代码:
// to serialize JSON in ASP.NET, it requires a class template.
[Serializable]
public class Data
{
// Yay for 3.5 auto properties
public string FirstName { get; set; }
public string LastName { get; set; }
public string Sign { get; set; }
};
[WebMethod]
public static List<Data> ServerSideTest()
{
List<Data> DataList = new List<Data>();
Data thisData = new Data();
thisData.FirstName = "Sol";
thisData.LastName = "Hawk";
thisData.Sign = "Aries";
DataList.Add(thisData);
Data thisData2 = new Data();
thisData2.FirstName = "Mako";
thisData2.LastName = "Shark";
thisData2.Sign = "Libra";
DataList.Add(thisData2);
return DataList;
}
我希望这有助于!
对我来说,下一步是获取过滤,分页和排序工作。让我知道如果你得到这些部件工作=)
你可能想看看zowen的解决方案在这里http://weblogs.asp.net/zowens/archive/2010/01/19/jquery-datatables-plugin-meets-c.aspx。他做了一个数据表达式分析器,工作得很好。
希望这会有所帮助。
+1分享与问题相关的链接。我发现这个链接对我的案例非常有帮助。谢谢。 – 2013-11-30 16:52:02
至少有两个问题在JavaScript代码:
- “数据”: “{ 'sEcho': '” + aoData [0]。价值+ “'}”,
这已经被乍得指出。这是获取声音的正确方法:
- “success”:function(msg){fnCallback(msg.d); }
如果您使用的是最新版本的.net(我相信3.5及更高版本),您需要调整成功函数以正确返回。阅读this了解为什么你必须通过“msg.d”。
这里是你的js代码更新:
$("#grid").dataTable({
"bJQueryUI": true,
"sPaginationType": "full_numbers",
"bServerSide":true,
"sAjaxSource": "GridTest.asmx/ServerSideTest",
"fnServerData": function(sSource, aoData, fnCallback) {
$.ajax({
"type": "POST",
"dataType": 'json',
"contentType": "application/json; charset=utf-8",
"url": sSource,
"data": "{'sEcho': '" + aoData[0].value + "'}",
"success": function (msg) {
fnCallback(msg.d);
}
});
}
});
然后得到这个工作在服务器端,我不知道你会在你的代码改变(因为我不是一个什么VB的家伙),但我知道,对我来说)以下工作(使用ASMX Web服务:
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections.Generic;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class GridTest : System.Web.Services.WebService
{
[WebMethod]
public FormatedList ServerSideTest(string sEcho)
{
var list = new FormatedList();
list.sEcho = sEcho;
list.iTotalRecords = 1;
list.iTotalDisplayRecords = 1;
var item = new List<string>();
item.Add("Gecko");
item.Add("Firefox 1.0");
item.Add("Win 98+/OSX.2+");
item.Add("1.7");
item.Add("A");
list.aaData = new List<List<string>>();
list.aaData.Add(item);
return list;
}
}
public class FormatedList
{
public FormatedList()
{
}
public string sEcho { get; set; }
public int iTotalRecords { get; set; }
public int iTotalDisplayRecords { get; set; }
public List<List<string>> aaData { get; set; }
}
类“FormatedList”仅仅是为了帮助使用JSON回报,自动转换,因为我们使用了ScriptService 。
你有没有得到过滤,分页和排序工作? – 2011-04-29 22:43:20