2012-04-04 14 views
16

Ich habe gekämpft, um eine Lösung für dieses Problem zu finden.Post Array als JSON zu MVC Controller

In meinem Code baue ich ein Array eines Objekts auf;

var $marks = []; 

var mark = function (x, y, counter){ 
    this.x = x; 
    this.y = y; 
    this.counter = counter; 
} 

$marks.push(new mark(1, 2, 0)); 
$marks.push(new mark(1, 2, 1)); 
$marks.push(new mark(1, 2, 2)); 

Jetzt möchte ich diese Daten an ein MVC-Controller schreiben, so würde ich denken, dass der Datentyp in der Steuerung ein List<Mark> Marks oder ein Array von Marks sein würde.

Um die Daten zu veröffentlichen, habe ich versucht;

var json = JSON.stringify($marks); 
$.post('url', json).done(function(data){ /* handle */ }); 

ODER

var json = { Marks: $marks }; 
$.post('url', json).done(function(data){ /* handle */ }); 

Der zweite Weg, wenn auf die Daten geschrieben suchen, sieht wie folgt aus

Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 0 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 1 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 2 

Aber ich bin nicht sicher, wie das typisierte Objekt in einem stark zu übersetzen in der Steuerung?

Mein Controller sieht so aus;

[HttpPost] 
public ActionResult JsonSaveMarks(List<Mark> Marks){ 
    // handle here 
} 

Meine Mark-Klasse sieht so aus;

public class Mark{ 
    public string x { get; set; } 
    public string y { get; set; } 
    public string counter { get; set; } 
} 

Ich habe über das Erstellen eines benutzerdefinierten JsonFilterAttribute oder mit dem System.Web.Script.Serialization.JavaScriptSerializer Klasse durch andere ähnliche Probleme lesen, aber ich kann nichts

Gibt es etwas offensichtlich fehle ich hier zu arbeiten? Habe ich den DataType im Controller komplett falsch? Wie kann ich diese Daten in ein stark typisiertes Objekt umwandeln?

Vielen Dank

+0

Wie sieht Ihre Mark-Klasse in MVC aus? – Pbirkoff

+0

@Pbirkoff Ich habe die Frage mit der Klasse –

+1

aktualisiert diese Frage zu überprüfen, vor allem die erste Antwort: http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp -net-mvc3 – Pbirkoff

Antwort

14

$.post() erlauben Ihnen nicht, den Inhaltstyp Ihres AJAX-Aufruf zu setzen - Sie könnten finden (wenn Sie Fiddler verwenden), dass Ihr JSON-String mit einer Content-Type von „Anwendung gesendet wird/x-www-form-urlencoded "(die Standardeinstellung), was dazu führt, dass Asp.Net MVC Ihr Datenpaket falsch interpretiert.

Können Sie stattdessen $.ajax() verwenden und den Inhaltstyp auf "application/json" setzen?

http://api.jquery.com/jQuery.ajax/

+0

Ah, du schlägst mich dazu, hatte die gleiche Idee – Pbirkoff

+1

Danke! Nach all den Kopfschmerzen wusste ich, dass es etwas Einfaches wäre! habe meinen Code auf '$ .ajax() 'geändert und die Daten als' JSON.stringify ($ marks) 'übergeben. –

+0

Vielen Dank. In meinem Fall war es der Inhaltstyp. – Jelling

13

@SteveHobbs hat das Recht, hier Antwort. Auf der anderen Seite sollten Sie die JavaScript-Nutzlast wie Sie haben JSON.stringify. Wenn Sie das anders machen, erhalten Sie eine Exception, die etwas wie "Ungültiges JSON-Primitiv" beim Deserialisieren der hereinkommenden Daten sagt.

Dies ist die komplette Lösung für Ihre Probe:

$.ajax({ 

    url: '/home/index', 
    type: 'POST', 
    data: JSON.stringify($marks), 
    dataType: 'json', 
    contentType: 'application/json', 
    success: function (data, textStatus, jqXHR) { 
     console.log(data); 
    } 
}); 
1

Dieser Code mein Problem behoben:

C# -Klassen:

public class MediaAccountContent 
{ 
    public Guid IdMedia { get; set; } 
    public string Value { get; set; } 

} 

public class User 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public List<MediaAccountContent> MediaAccountContents { get; set; } 
} 

MVC Aktion:

public ActionResult SavePlace(User user) 
{ 

    return Content("OK"); 
} 

Javascript:

var mediaAccountsJson = []; 

    for (var i = 0; i < 10; i++) 
    { 
     mediaAccountsJson.push({ 
      IdMedia: i, 
      Value: "AAA" + i 
     }); 

    } 

    var datatItem = 
    { 
     Firstname: "Test Firstname", 
     Lastname: "Test Lastname", 
     MediaAccountContents: mediaAccountsJson 
    }; 

    $.ajax({ 
     type: "POST", 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify(datatItem), 
     url: urlAction, 
     success: function (status) { 



     } 
    }); 

Nehmen Sie die Änderungen vor, die Sie für Ihr Szenario benötigen, und genießen Sie! :)

+0

Dieser Code nur post Json-Objekt nicht ein Objekt-Array – mzonerz

Verwandte Themen