2013-02-20 6 views
7

ich jQuery 1.9.1 und MVC 4.De-Serialisierung Objekt in MVC4 Aktion Ergebnisse in null-Wert

Ich habe folgendes Javascript bin mit:

$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    data: JSON.stringify({ devices: [{ Id: 123, Name: "something", MapName: "map" },{ Id: 321, Name: "a name", MapName: "another map" }] }), 
    dataType: 'json', 
    contentType: 'application/json' 
} 

Und der folgenden C# in meinem Homecontroller:

[HttpPost] 
public string doSomething(Device[ ] devices) 
{ 
    //stuff consuming that array 
} 

die Geräteklasse wird wie folgt definiert:

[Serializable] 
public class Device 
{ 
    public long Id; 
    public string Name; 
    public string MapName; 
} 

Entsprechend dem Debugger ist das Array devices ein Array mit zwei Elementen, wobei alle Eigenschaften jedes Device-Elements null sind.

Nach Chrom, sieht die Post-Daten wie folgt aus:

{ 
    "devices": [ 
     { 
      "Id": 123, 
      "Name": "something", 
      "MapName": "map" 
     }, 
     { 
      "Id": 321, 
      "Name": "a name", 
      "MapName": "another map" 
     } 
    ] 
} 

Was falsch ist hier, dass macht MVC schwören auf und ab, dass diese Objekte null sind, noch geben Sie mir noch eine angemessene Länge Reihe von Sie?

Ich habe versucht, das Array direkt zu veröffentlichen, ohne JSON.stringify darauf aufzurufen. Ich habe versucht, das Array innerhalb eines Objekts als eine Eigenschaft namens "Geräte" zu veröffentlichen, wiederum ohne es zu striggern. Ich habe versucht, das Array in einem Objekt als eine Eigenschaft namens "Geräte" zu veröffentlichen, während nur das Array selbst string.

All dies führt zu einem schlechten Verhalten der einen oder anderen Form. Entweder stellt chrome die entsprechenden Daten überhaupt nicht zur Verfügung, oder MVC deinstalliert sie nicht.

Ich habe das Netz durchforstet und kann anscheinend keine Beispiele finden, warum dies gebrochen werden sollte.

bearbeiten 2013.02.21 13.12 UTC-5:

ich auch dies versucht haben, ohne JSON zu verwenden und nur lassen jQuery es als Formulardaten veröffentlichen. Hier ist der Code für das:

var postData = { devices: [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }] }; 
$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    data: postData 
}); 

Und die C# ist immer noch die gleichen wie oben.

Das Verhalten ist immer noch das gleiche wie wenn es JSON war. MVC erkennt ein Array mit 2 Elementen, aber alle Werte der Objekte in diesem Array sind Standard (0 für die Ganzzahl und null für die Strings).

+0

Für was es wert ist, schlägt dies auch fehl, wenn ich es nicht als JSON post. Ich bin nicht mit JSON verheiratet, aber ich brauche MVC zum Deserialisieren der Post-Daten/irgendwie /. – dodexahedron

Antwort

3

Hier ist, was endlich funktioniert ...

Zuerst änderte es das Javascript, das Objekt mit einer Eigenschaft namens „Geräte“ zu machen, der die Zeichenfolge Array enthält:

var postData = { devices: JSON.stringify([{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }]) }; 
$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    dataType: 'json', 
    data: postData 
    } 

Dann machte ich die Controller-Aktion nimmt einen einzelnen String als „Geräte“ und de -serialized es JSON.Net manuell mit:

[HttpPost] 
public string MakeMmLinks(string devices) 
{ 
    List<Device> devicesList = JsonConvert.DeserializeObject<List<Device>>(devices); 
    ... 
} 

Das funktionierte gut, aber was mich stört, ist, dass das Objekt Deserialisierung nativ etwas, das MVC behandelt werden soll.

Wenn jemand einen Einblick hat, was hier passiert ist oder was ich falsch gemacht habe, würde ich es gerne hören.

+0

Keine Einsichten, aber danke, ich verbrachte ewig damit, mich über das gleiche Problem zu kratzen. –

0

Sie veröffentlichen ein Objekt mit einer Eigenschaft, die ein Array von 2 Geräten enthält. Wenn Sie das Geräte-Array einfach posten möchten, versuchen Sie Folgendes.

var devices = [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }]; 
$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    data: JSON.stringify(devices), 
    dataType: 'json', 
    contentType: 'application/json' 
}); 
+0

Das war die Art, wie ich es ursprünglich gemacht habe, und das führt zu demselben Verhalten. MVC empfängt das Array, weiß, wie viele Elemente darin enthalten sind, und setzt alle Eigenschaften der Elemente auf null. – dodexahedron

+2

Warum posten Sie eine Zeichenfolge an Ihren Controller? Post js Objekt selbst. –

+0

Das direkte Posten des Arrays führt auch zu einem schlechten Verhalten. Chrome sendet "undefined = & undefined =" als Post-Daten, wenn ich das Array direkt poste. – dodexahedron

1

In Fällen wie diesen ich tradition: true gefunden habe, ist sehr wichtig. Nicht sicher, dass Sie stringify müssen

dataType: 'json', 
traditional: true 
Verwandte Themen