jQuery DataTables traitement côté serveur et ASP.Net

j'essaie d'utiliser la fonctionnalité côté serveur du plugin jQuery Datatables avec ASP.Net. La requête ajax renvoie JSON valide, mais rien n'apparaît dans la table.

j'ai d'abord eu des problèmes avec les données que j'envoyais dans la demande ajax. J'ai eu une erreur de "Primative JSON invalide". J'ai découvert que les données doivent être dans une chaîne de caractères au lieu de JSON sérialisé, comme décrit dans ce post: http://encosia.com/2008/06/05/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/. Je ne savais pas trop comment corriger cela, alors j'ai essayé d'ajouter ceci dans la requête ajax:

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

si les aboves fonctionnent éventuellement, j'ajouterai les autres paramètres plus tard. Pour l'instant, j'essaie de trouver quelque chose à ma table.

le JSON de retour semble ok et VALIDE, mais le sEcho dans le post n'est pas défini, et je pense que c'est pourquoi aucune donnée n'est chargée dans la table.

alors, qu'est-ce que je fais de mal? Suis-je encore sur la bonne voie ou suis-je stupide? Est-ce que quelqu'un a déjà vu ça ou a des suggestions?

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

Returned JSON:

{"__type":"Data","sEcho":0,"iTotalRecords":2,"iTotalDisplayRecords":2,"aaData":[["testing","chad","testing"],["testing2","chad","testing"]]}
10
demandé sur Chad Yeates 2010-02-05 23:26:49

4 réponses

j'ai changé les données

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

et ça a fonctionné. La question est donc maintenant de savoir comment transmettre le reste des données au service web. J'ai essayé D'utiliser JSON2 pour transformer le JSON en chaîne, mais cela a ouvert une autre boîte de vers, et est un problème séparé.

3
répondu Chad Yeates 2010-02-05 21:43:19
  1. "données": "{'sEcho': '" + aoData[0].valeur + "'}",

cela a déjà été pointé par Chad. C'est le bon moyen de faire le sEcho:

  1. "succès": function (msg) { fnCallback(msg.d);}

si vous utilisez une version récente de .net (je crois 3.5 et plus) vous devez ajuster la fonction de succès pour retourner correctement. Lire pour comprendre pourquoi tu dois passer " msg.d".

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

alors pour que cela fonctionne du côté serveur, Je ne suis pas sûr de ce que vous devrez changer dans votre code (puisque je ne suis pas un type VB), mais je sais que ce qui suit fonctionne pour moi (en utilisant un service Web 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; }
}

la classe "FormatedList" est simplement pour aider avec le retour json, converti automatiquement parce que nous utilisons le service Scripts.

3
répondu wdanda 2011-03-01 20:26:01

j'ai travaillé sur la même chose et un ami m'a aidé avec cette partie. Ce code est en C# mais vous devriez pouvoir le porter.

jQuery code:

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

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

code derrière:

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

j'espère que cela aide!

la prochaine étape pour moi est de faire fonctionner le filtrage, la pagination et le tri. Faites moi savoir si vous obtenez ces parties de travail =)

2
répondu Solburn 2010-06-15 19:51:19

vous pourriez vouloir jeter un oeil à la solution de zowen ici http://weblogs.asp.net/zowens/archive/2010/01/19/jquery-datatables-plugin-meets-c.aspx. Il a fait un analyseur qui marche plutôt bien.

J'espère que cela vous aidera.

1
répondu Izmoto 2010-09-28 13:36:53