2016-06-20 20 views
0

Ich bin auf der Suche nach Code, den ich verwenden kann, um die Kendo-Grid-Daten auf dem Formular submit Controller zu buchen. Hinweis: Ich kann keinen JSON-Post verwenden, da ich die Rasterdaten verwenden muss, um eine Excel-Datei zu erstellen. Was ich in meiner jQuery versuche: Hier ist UserRegistrationForm mein Formularname, der das Gitter enthält.Post Kendo Gitter Daten auf Formular senden

$("#UserRegistrationForm").submit(); 

Können Sie mir vorschlagen, wie meine Controller-Aktion aussehen soll, um die Werte des Gitters zu erhalten.

+0

Irgendwelche Neuigkeiten dazu? – DontVoteMeDown

Antwort

0

Um dies zu erreichen, erzeuge ich normalerweise versteckte Felder mit den Daten des Gitters, bevor ich das Formular submittiere. Eine einfache Art und Weise für das tun:

$("#my-form").submit(function() { 
    var grid = $("#grid").data("kendoGrid"), 
     data = grid.dataSource.data(), 
     columns = grid.options.columns.map(function(item) { return item.field; }), 
     html = ""; 

    for (var i = 0; i < data.length; i++) { 
     var fields = Object.keys(data[i]); 

     for (var n = 0; n < fields.length; n++) { 
      if (columns.indexOf(fields[n]) > -1) { 
       html+= "<input type='hidden' name='" + fields[n] + "[" + i + "]' value='" + data[i][fields[n]] + "' />"; 
      } 
     } 
    } 

    $("#hidden-fields").empty().append(html); 
}); 

Working Demo

Dies in einer Reihe von verdeckten Feldern innerhalb eines div führen (#hidden-fields), die auch in der Form ist. Seine Namen werden so etwas wie dieses:

name="PropertyA[0]" value="valueOfA0" 
name="PropertyB[0]" value="valueOfB0" 
name="PropertyA[1]" value="valueOfA1" 
name="PropertyB[1]" value="valueOfB1" and so on... 

Dies passt problemlos eine ASP.Net MVC-Liste Parameter oder im Falle einer Liste in einem Ansichtsmodell, nur den Namen des Ansichtsmodell hinzufügen, bevor dem Eigenschaftsnamen, z.B. ViewModel.PropertyA[0]. Für PHP wird es in einem Array z. $_POST["PropertyA"]. Ich bin mir anderer API-Sprachen nicht sicher.

+0

Nur ein Hinweis: während die versteckte Feldlösung funktioniert (ich habe es getan), funktioniert es nicht gut für große Datensätze und wird überhaupt nicht funktionieren, wenn Sie Grid-Paging verwenden, da nicht alle Zeilen gleichzeitig gerendert werden. –

+0

@TheDreadPirateStephen was meinst du mit "funktioniert nicht mit großen Datensätzen"? Gibt es eine bestimmte Menge an Daten, die Browser oder API nicht gut verarbeiten können? Wenn Sie in Ihrem Grid Server-Paging eingerichtet haben, können Sie zwar nicht alle Daten verarbeiten, da sie nicht vollständig geladen sind, aber wenn sie nicht geladen sind, besteht kein Grund, sie zu aktualisieren, da sie nicht aktualisiert wurden. Recht? Übrigens, wenn Ihr Grid auf Client-Seite ausgelagert wird, funktioniert das obige Snippet ordnungsgemäß, da die Daten vollständig geladen sind [markieren Sie dies] (http://dojo.telerik.com/aXiYO). – DontVoteMeDown

+0

Sogar clientseitig wird nur eine Seite von Daten als HTML auf einmal gerendert. Der Rest der Daten ist nur die dataSource. Daher werden die nicht gerenderten Zeilen auch nicht mit ihren versteckten Eingabefeldern gerendert und daher nicht veröffentlicht, wenn sich das Formular befindet. Sie würden dann erfordern, dass Ihre Seitengröße groß genug ist, um Ihre größte Datensatzgröße zu rendern, die schließlich zu viel HTML rendern wird, und der Browser beginnt zu tuckern. Wenn Sie in Ihrem Beispiel das Rendering der ausgeblendeten Eingabe hinzufügen und dann das Formular (mit dem Raster innerhalb des Formulars) hochladen, werden nur die Daten der aktuellen Seite gepostet. –