2014-02-06 13 views
6

Ich benutze Kendo Grid und möchte Filterung, Sortierung und Paging auf dem Server durchführen. Ich verstehe, dass ich zu der Datenquelle hinzufügen sollte:kendo ui Gitterfilter, Sortieren und Paging im Server

serverPaging: true, 
serverSorting: true 

Aber wie kann ich feststellen, das Raster/Datasource-URL, die es für die sortig verwenden sollten, Filtern usw. Und was ist, wenn ich die sortig selbst ausführen möchten? Ich möchte das Steuerelement verwenden, das Kendo bietet, aber selbst zum Server gehen. Gibt es ein Event wie "sortTriggered" wo ich "prevntDefault" oder so ähnlich nennen kann ... ich weiß es nicht.

+0

Welche serverseitige Technologie verwenden Sie? –

+0

Weiß nicht, ob es relevant ist, aber wir verwenden –

+0

Es ist relevant. Jetzt poste ich eine einfache Konfiguration ohne JS-Code. –

Antwort

3

Werfen Sie einen Blick auf dieses Beispiel. Es verwendet die MobileServices-JavaScript-API für Windows Azure, zeigt Ihnen jedoch, wie Sie mit Server-Paging und -Sortierung umgehen.

http://jsbin.com/efeKiwO/11/edit

Auf der Transportfunktion von Ihrer Datenquelle, jede Methode (lesen, zu aktualisieren, erstellen, zerstören) kann auf eine Funktion konfiguriert werden (dies ist die Lesefunktion, behandelt sie jedes Sortier- und Paging).

read: function(options) { 
     // Get the table 
     var table = client.getTable("Customer"); 

     // Build base query 
     var query = table.includeTotalCount(); 

     // Add paging 
     if(options.data.skip !== undefined && options.data.take !== undefined) { 
      query = query.skip(options.data.skip).take(options.data.take); 
     } 

     // Add sorting 
     if(typeof options.data.sort !== "undefined" && options.data.sort !== null) { 
      for(var i = 0; i< options.data.sort.length; i++) { 
      if(options.data.sort[i].dir === "desc") { 
       query = query.orderByDescending(options.data.sort[i].field); 
      } 
      else { 
       query = query.orderBy(options.data.sort[i].field); 
       } 
      } 
     } 

     var promise = query.read(); 

     promise.done(function(data) { 
      options.success(data); 
     }); 
     }, 

Innerhalb dieser Funktion können Sie tun, was auch immer Sie möchten. Anstatt eine JavaScript-Bibliothek wie dieses Beispiel zu verwenden, könnten Sie einen $ .getJSON-Aufruf oder einen $ .ajax-Aufruf oder was auch immer Sie tun möchten, ausführen. Das Parameterobjekt für die Funktion enthält alles, was Sie zum Paging, Sortieren und Filtern benötigen. Sobald Sie die Daten haben, rufen Sie einfach options.success (dataSet); mit Ihrem richtig sortierten/paged DataSet und Ihr Gitter wird daran gebunden.

+0

Genau das habe ich versucht, aber aus irgendeinem Grund, wenn ich "serverSorting" zur Datenquelle hinzufüge, funktioniert die Sortierung nicht und die Lesefunktion wird nicht aufgerufen. –

+0

Sie benötigen das ServerSorting nicht, wenn Sie es auf der Clientseite behandeln. –

+0

Wenn ich das "serverSorting" entferne, wird die Lesefunktion definitiv nicht aufgerufen. Wie auch immer, ich habe das Problem behoben. Es funktioniert jetzt, danke. –

0

Das Kendo-Grid verwendet nur eine URL, um Daten abzurufen, und es wird vom DataSource-Objekt übernommen.

Diese URL wird jedes Mal vom Grid aufgerufen, wenn Daten benötigt werden. Die Sortier- und Paging-Parameter werden jeder Anforderung hinzugefügt, die im Grid-Kontext an die Server-Basis gestellt wird.

Der Server erhält dann eine Standard-Webanforderung mit allen erforderlichen Parametern, um eine eigene Anfrage zu erstellen. Dann müssen Sie als Antwort richtig formatiert senden (zB: JSONP OData).

+0

Also kann ich keine URL haben, die ich will? Was ist, wenn ich eine spezielle URL habe, die ich nicht verwenden kann? –

+0

Sie meinen, dass Sie eine andere URL basierend auf der gewünschten Sortierung/Seite haben? –

+0

andere URL, andere Argumente ... –

3

Ihre Konfiguration ist fast da,

Was fehlt, ist die geheime Zutat zu MVC verbinden.

Lässt Ihre Datasource Konfiguration das ist wie nehmen:

var myDataSource = new kendo.data.DataSource({ 
    transport: { 
     read: { 
      url: 'Users/Read', 
      type: 'POST' 
     } 
    }, 
    serverSorting: true, 
    serverFiltering: true, 
    serverPaging: true 
} 

Auf dem Server-Seite in UsersController.cs (Beispiel), Sie erhalten haben [DataSourceRequest]

public DataSourceResult Read([DataSourceRequest] DataSourceRequest request) 
{ 
    // Here you might actually get the items from your cache or database. 
    var List<User> myList = new List<User>();   

    // Here is when the kendo magic happens. 
    return myList.ToDataSourceResult(request); 
} 

Warum [DataSourceRequest ] ist wichtig?

Da es die Paging-, Sortier- und Filterparameter enthält, die Ihr Grid an den Server sendet. Wenn Sie also den Algorithmus selbst durchführen wollen, müssen Sie die Anfrage prüfen und diese Parameter verarbeiten. Denken Sie daran, eine DataSourceResult-Objektinstanz zurückzugeben.

Wenn Ihre Objekte in einem Cache gespeichert sind und Ihre Felder keine spezielle Behandlung zum Filtern, Gruppieren, Sortieren usw. benötigen, verwenden Sie einfach die Kendo C# -Erweiterung ToDataSourceResult. Es verarbeitet Ihre Elemente und wendet die Filter-, Sortier- und Paging-Konfiguration mithilfe dynamischer LINQ-Anweisungen an.

+0

Angenommen, Entity-Framework oder andere IQueryable Ergebnis von Server-Seite, wie würde. ToDataSourceResult arbeiten ... Von meinem Verständnis würde es das Paging/Sortierung usw. im Speicher tun, anstatt SQL Server das schwere Heben zu lassen ... –

+0

Nun, das ist mehr eine Frage an die Kendo-Jungs gestellt werden. Ich habe ein wenig von ihrem C# -Code untersucht und ja, sie verwenden LINQ, um alle notwendigen Transformationen zu machen, also hängt es tatsächlich davon ab, was das IEnumerable sichert. So ist es möglich, dass die DB am Ende das ganze schwere Heben macht. Verwirklichen Sie Ihre Abfrage nicht in In-Memory-Objekten, bevor Sie sie an Kendo übergeben. Disclaimer: Wir haben keine Lizenz für die Verwendung der neuesten Kendo-Version in meiner Firma gekauft, da wir nicht mehr von diesem Framework abhängig sind, sodass mein Wissen über Server-Side-Kendo viel veraltet sein könnte. –