2010-02-05 39 views
10

Tôi đang cố gắng sử dụng chức năng phía máy chủ của plugin jQuery Datatables với ASP.Net. Yêu cầu ajax đang trả lại JSON hợp lệ, nhưng không có gì hiển thị trong bảng.Xử lý bên máy chủ jQuery DataTables và ASP.Net

Tôi ban đầu gặp sự cố với dữ liệu tôi đã gửi trong yêu cầu ajax. Tôi đã nhận được lỗi "Nguyên thủy JSON không hợp lệ". Tôi phát hiện ra rằng dữ liệu cần phải nằm trong một chuỗi thay vì JSON được tuần tự hóa, như được mô tả trong bài đăng này: http://encosia.com/2008/06/05/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/. Tôi đã không hoàn toàn chắc chắn làm thế nào để sửa chữa điều đó, vì vậy tôi đã cố gắng thêm điều này trong yêu cầu ajax:

"data": "{'sEcho': '" + aoData.sEcho + "'}" 

Nếu aboves cuối cùng hoạt động, tôi sẽ thêm các thông số khác sau. Ngay bây giờ tôi chỉ đang cố gắng để có được một cái gì đó để hiển thị trong bảng của tôi.

Trả về JSON có vẻ ok và xác thực, nhưng sEcho trong bài đăng không được xác định và tôi nghĩ rằng đó là lý do tại sao không có dữ liệu nào được tải vào bảng.

Vì vậy, tôi đang làm gì sai? Tôi thậm chí có đi đúng hướng hay tôi đang ngu ngốc? Có ai chạy vào điều này trước hoặc có bất cứ đề nghị?

Dưới đây là jQuery tôi:

$(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 

trả lại JSON:

{"__type":"Data","sEcho":0,"iTotalRecords":2,"iTotalDisplayRecords":2,"aaData":[["testing","chad","testing"],["testing2","chad","testing"]]} 

Trả lời

3

Tôi đã thay đổi dữ liệu thành

"data": "{'sEcho': '"+ aoData[0].value + "'}", 

và hoạt động. Vì vậy, bây giờ câu hỏi là làm thế nào để vượt qua phần còn lại của dữ liệu vào webservice. Tôi đã thử sử dụng JSON2 để biến JSON thành một chuỗi, nhưng điều đó đã mở ra một loại sâu khác và là một vấn đề riêng biệt.

2

Tôi đã làm việc trên cùng một điều và một người bạn của tôi đã giúp tôi với phần này. Mã này là trong C# nhưng bạn sẽ có thể chuyển nó qua.

mã jQuery: Mã

<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> 

mã sau:

// 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; 
    } 

Tôi hy vọng điều này sẽ giúp!

Bước tiếp theo cho tôi là lọc, phân trang và phân loại hoạt động. Hãy cho tôi biết nếu bạn nhận các bộ phận này hoạt động =)

+2

bạn đã bao giờ nhận được tính năng lọc, phân trang và sắp xếp để hoạt động chưa? –

1

Bạn có thể muốn xem giải pháp của zowen tại đây http://weblogs.asp.net/zowens/archive/2010/01/19/jquery-datatables-plugin-meets-c.aspx. Anh ấy đã thực hiện một trình phân tích cú pháp có thể định dạng hoạt động khá tốt.

Hy vọng điều này sẽ hữu ích.

+0

+1 để chia sẻ liên kết có liên quan đến câu hỏi. Tôi thấy liên kết rất hữu ích cho trường hợp của tôi. Cảm ơn. –

3

Có ít nhất hai vấn đề trong mã javascript của bạn:

  1. "dữ liệu": "{ 'sEcho': '" + aoData [0] .Value + "'}",

Điều này đã được Chad chỉ ra. Đó là đúng cách để có được sEcho:

  1. "thành công": hàm (msg) {fnCallback (msg.d); }

Nếu bạn đang sử dụng phiên bản .net gần đây (tôi tin là 3.5 trở lên), bạn cần điều chỉnh chức năng thành công để trả lại chính xác. Đọc this để hiểu tại sao bạn phải chuyển "msg.d".

Dưới đây là mã js của bạn Cập nhật:

$("#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); 
         } 
      }); 
     } 
    }); 

Sau đó, để có được điều này làm việc trên phía máy chủ, tôi không chắc chắn những gì bạn sẽ phải thay đổi trong mã của bạn (vì tôi không phải là một VB guy), nhưng tôi biết rằng các công trình sau đây đối với tôi (sử dụng một webservice asmx):

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; } 
} 

lớp "FormatedList" chỉ đơn giản là để giúp đỡ với sự trở lại json, chuyển đổi tự động vì chúng ta đang sử dụng ScriptService .

Các vấn đề liên quan