2016-04-14 10 views
0

Ich habe ein "Person" ADO.Net-Entity-Modell erstellt und "gerüst" einen Web-API-Controller daraus. Das Entitätsmodell ist verschachtelt, da es ein Array anderer Objekte enthält.WebAPI-Parameter null

Da diese verschachtelten Objekte eine Eigenschaft enthalten, die auf ihre Eltern verweist, sind sie nicht serialisierbar. Also habe ich eine "JSON_Person" -Klasse erstellt, in die ich das Person-Objekt und seine verschachtelten Eigenschaften kopieren konnte (abzüglich der Referenz der verschachtelten Objekte auf ihre Eltern), damit sie mit der GET-Methode abgerufen werden konnten.

Bis zu diesem Zeitpunkt funktionierte alles wie erwartet. Ich könnte eine GET-Anfrage an die API machen und ein Array von JSON-Objekten erhalten, jedes mit einem eigenen Array von verschachtelten Objekten. Ich könnte auch eine PUT-Anfrage an die API machen und einen Datensatz aktualisieren.

Auch wenn die PUT-Methode akzeptiert ein „Person“ Objekt und nicht ein „JSON_Person“, es funktioniert, weil (ich nehme an) die JSON_Person und Eigenschaften der Person auf 1 bis 1 entsprechen

jedoch nach Änderung des Parameters Geben Sie von Person zu JSON_Person ein, der Parameter in der API zeigt jetzt immer null an.

Ich habe gesagt, dass es wahrscheinlich eine "Typumwandlung scheitern", aber es scheint mir unwahrscheinlich, da selbst wenn GET das Objekt und dann PUT es gleich wieder unverändert, es immer noch fehlschlägt.

Dinge, die ich habe versucht:

  1. Hinzufügen [FromBody] zu dem API-Parameter.
  2. Ändern der "contentType: 'Anwendung/json; charset = utf-8'" im jQuery.ajax Aufruf.
  3. Alle Eigenschaften auf null setzen, bevor sie an die Testtypkonvertierung gesendet werden.

AJAX Aufruf

$.ajax({ 
    type: "PUT", 
    url: "/api/person/" + selected.Id, 
    data: JSON.stringify(selected), 
    contentType: 'application/json; charset=utf-8', 
    success: function() {}, 
    error: function() { 
     return alert("error"); 
    } 
}); 

Put Methode

[ResponseType(typeof(void))] 
public IHttpActionResult PutPerson(int id, JSON_Person json_Person) 
{ 
    // Convert JSON_Person back to Person and do other stuffs... 
} 
+0

Haben Sie die Eigenschaft 'ModelState.Errors' überprüft? –

+0

Ich sehe keine Errors-Eigenschaft für ModelState. – Austneal

Antwort

1

Stellt sich heraus, es überhaupt kein Problem mit der PUT-Methode war. Ich hatte eine partielle Klasse Person erstellt, um der Klasse einen Konstruktor hinzuzufügen, der eine JSON_Person akzeptiert (um JSON_Person wieder in eine Person zu konvertieren), aber keinen leeren Konstruktor hatte.

Nach dem Hinzufügen eines Konstruktors, der keine Parameter akzeptiert, hat es funktioniert!

public JSON_Person() { } 
Verwandte Themen