MVC3 Komplexe JSON-Listenbindung

8

Probleme beim Abrufen von ASP.NET MVC3 zum Binden meines komplexen JSON-Objekts, das eine Liste enthält.

Hier ist die Struktur, die ich für meine Objekte habe.

%Vor%

Sie können davon ausgehen, dass CustomObject3 von ähnlicher Struktur ist - es ist nicht nötig, noch eine weitere erfundene Klasse zu duplizieren, also denke ich, dass Sie Ihre Vorstellungskraft nutzen können:)

Hier ist die Javascript / Jquery, die den POST-Aufruf durchführt (angenommen, dass alle JS, die dazu führt, die richtigen Daten liefert):

%Vor%

Und schließlich (ich weiß, ziemlich viel Code) hier ist ein Überblick über die Methode, die ich habe:

%Vor%

Wie gesagt, das erste Objekt ist gefüllt und alle Daten sind vorhanden, wenn ich debugge und durchtrete. Wenn ich zwei Objekte im Array Objects im JSON-Objekt übergebe, sehe ich einen Count von 2 im Controller, aber Custom2Id und SubItemId sind leer. Was gibt?

Wenn ich ein contentType von 'application/json' in meinem $.ajax -Aufruf festlege, beschwert sich MVC über die Daten, die übergeben werden. Ich habe auch versucht, den Parameter model in der MVC-Methode in zwei separate Parameter aufzuteilen, aber das hilft nicht.

Jede Hilfe wird sehr geschätzt - diese hat mich ratlos!

    
Mattygabe 19.03.2012, 14:09
quelle

2 Antworten

5

Also ist die Lösung für dieses spezielle Problem eine Kombination von zwei oder mehr Lösungen, die anderswo auf SO gefunden wurden (eine davon ist vielleicht Jakubs Antwort, die sich auf die Verwendung eines generischen Sammlertyps - IEnumerable - im Gegensatz zu einem mehr bezieht konkrete one - List ).

Zuerst muss der serverseitige Code nicht geändert werden - alles ist gut auf dieser Front. Alle Änderungen, die vorgenommen werden müssen, sind Client-Seite und speziell, wie jQuery und Ihr Javascript die Daten an den Server senden.

Hier ist das alte Javascript:

%Vor%

Das erste Problem hier ist, dass das Javascript den Server bei '/Action/Method' nicht informiert, was genau Sie senden (ist es binär, ist es eine Mischung von Parametern, oder ist es JSON?), also fügen Sie eine contentType: 'application/json' -Zeile hinzu wird diesem Zweck dienen. Wenn Sie dies tun, weiß der Server, dass er JSON dekodieren muss ...

Aber so, wie es jetzt aussehen würde, würde die Decodierung mit einer Ausnahme fehlschlagen (" Invalid JSON primitive "), bevor der Code sogar in Ihre Methode eintritt (MVC übernimmt dann die Decodierung und Bindung). Im obigen AJAX-Aufruf habe ich ein neues JSON-Objekt in den $.ajax -Optionen erstellt, aber der gesendete JSON würde keinen JSON-Validator passieren (James Kyburz erwähnt einen großen JSON-Validator: JSONLint Validator ). Erstellen Sie stattdessen das JSON-Objekt vor dem Aufruf $.ajax , und stringieren Sie das Objekt so, dass es in einem geeigneten JSON-Format vorliegt. Insgesamt sollte der AJAX-Aufruf folgendermaßen aussehen:

%Vor%     
Mattygabe 19.03.2012, 18:07
quelle
3

Ändern Sie public IEnumerable<CustomObject2> Objects { get; set; } in List<CustomObject2>

Modellbinder weiß nicht, wie man eine Instanz von IEnumerable interface erstellt, es braucht etwas konkreteres.

Sie müssen das auch ändern:

data: { CustomObject: firstObj, Objects: objsArray }

in

data: { model: { CustomObject: firstObj, Objects: objsArray } }

Der model -Teil entspricht dem Namen des Parameters in Ihrer Aktion.

    
Jakub Konecki 19.03.2012 14:12
quelle

Tags und Links