2013-05-04 11 views
9

Ich erstelle eine Anwendung mit Durandal, mit WebAPI als Server. Ich habe ein KendoUI-Gitter, das die Daten vom Server korrekt anzeigt und ordnungsgemäß funktioniert, bis die POST- oder PUT-Methoden aufgerufen werden. Hier ist meine Methode GET: enter image description hereWebAPI-Modellbindung von JSON

und Sie können sehen, dass die Daten an die UI bindet (die data-bind extensibility in Durandal verwendet zu ändern Bindungen Kendo): enter image description here

Dann bearbeite ich die Daten im Grid und es geht um die Änderungen in der Anfrage an den Server, wie Sie in diesem Fiddler Ergebnis sehen: enter image description here

auf der Serverseite kann ich die Daten bekommt, die von den Kunden weitergegeben wird, etwas zu binden, ich als Parameter platzieren für die Methode auf dem POST oder PUT. enter image description here

ich dies zu realisieren ist ein paar verschiedene Technologien zur Fehlerbehebung (zB Durandal, KnockoutJs, Kendo Databinding und WebAPI), aber ich denke, die Grundlagen arbeiten, werden die Daten abgerufen und gebunden an die Benutzeroberfläche, und es wird wieder gebucht wenn geändert, aber der WebAPI-Endpunkt kann nicht an die Daten gebunden werden.

Wie kann ich das übergebene "models" -Array durch die ModelBinding-Struktur in WebAPI binden?

UPDATE- Hier ist das hilfreich JSFiddle, die mir den richtigen Content-Type gab hinzuzufügen: http://jsfiddle.net/Xhrrj/1/

new kendo.data.DataSource({ transport: { read: { type: "POST", url: "../cccs/service.svc/SupplierSearch", contentType: "application/json; charset=utf-8", dataType: 'json'...

dies aus dem Telerik Forum kommenden here

+0

Basierend auf dem Beispiel fiddler Anfrage senden Sie die Daten zurück, aber nicht im richtigen Format, so dass Web.API es nicht konsumieren kann. Das Problem ist also, wie Sie die Daten serialisieren. Also poste bitte den Code deiner Methode zum Speichern von Änderungen oder wo du die 'put' Anfrage erstellst. – nemesv

+2

Es sieht so aus, als würde es form-urlencoded mit dem json-Format vermischen - es sendet 'models =' und dann folgen urlencodierte JSON-Objekte. –

+0

@nemesv, Ich benutze KendoUI's JavaScript-Funktionen, hier ist ein Ausschnitt, den ich denke, könnte hilfreich sein: parameterMap: function (options, operation) { if (operation! == "lesen" && options.models) { zurück { Modelle: kendo.stringify (options.models)}; } } - Link http://docs.kendoui.com/getting-started/web/grid/editing - auch das Lesen, könnte eine Möglichkeit sein, das JSON-Modell zu ändern, aber nicht sicher - http: // docs .kendoui.com/getting-started/framework/datasource/overview –

Antwort

6

Es sieht so aus, als würde es form-urlencoded mit json Format mischen - wenn Sie die decodierte Zeichenfolge sehen, sendet es models= und dann urlencoded JSON-Objekte folgen.

+1

Die HTTP-Header formatierten die Zeichenfolge zu this-- Content-Type: application/x-www-form-urlencoded; Zeichensatz = UTF-8. Indem ich folgendes in mein JavaScript-Objekt für PUT und POST platzierte, erhielt ich die korrekten Daten durch - contentType: "application/json; charset = utf-8" –

0

Aus meiner Erfahrung, die ich denke, dass Ihre PUT-Endpunkterklärung muss folgendermaßen aussehen:

[HttpPut] 
public void Put([FromBody]IEnumerable<Product> models) { } 

Sie benötigen also das FromBody-Attribut, weil sich Ihr Produkt-Array im Body befindet (denke ich?) Und nicht in der URL der Anfrage.

+0

Hey Alex, danke für die Antwort, aber deine Antwort änderte die Bindungswerte nicht, es war tatsächlich, dass ich den Content-Type-Header explizit angeben musste, um die JSON-Daten zu binden in den API-Methoden. –