Edit: Ich habe die Lösung bekommen habe und es ein bisschen mehr am Ende der
Mit Post beschrieben: MVC 3, C#
Problem: Ein Schlüssel/Wert-obj-Array-Controller gesendet über $ .post/$ ajax Ergebnisse in einem 500-internen Serverfehler in der Steuerung (da der Wert die Methode in den C# Controller übergeben ist null)
ich habe ein Array, das in dem Format ist:.
{
"q_1": {
"qid": "1",
"tmr": 0
},
"q_2": {
"qid": "2",
"tmr": 0
}
}
Ich bekomme dies über $ ("# myid"). Data() - und das ist alles in Ordnung.
Ich muss das mein Controller senden, und versucht, beide Pfosten und .ajax $
var d = $("#q_data").data();
$.post("/run/submit", d, function(data) { alert(data);}, "application/json");
und
$.ajax({
url: '/run/submit',
data: d,
contentType: 'application/json',
dataType: 'json',
success: function (data) { alert(data); }
});
Verfahren auf der C# Seite ist
public ActionResult Submit(List<PerfObj> dict)
{
int x = dict.Count;
return PartialView("_DummyPartial");
}
Wo PerfObj ist mein Modell
public class PerfObj
{
public string id { get; set; }
Perfvar perfVar;
}
public class PerfVar
{
public string qid { get; set; }
/* note I've tried both int and string for the tmr param */
public string tmr { get; set; }
}
Wenn ich dies ausfühle, geht der Aufruf korrekt zum Controller - d. H. Er trifft die Methode submit. Der Methodenparameter dict, in
List<PerfObj> dict
ist Null.
Warum? Es scheint etwas mit meinem Modell zu sein, kann nicht herausfinden, wie man es sonst noch entwerfen könnte, also extrahiert es die Werte korrekt zu dem Methodenparameter.
Wenn ich das JSON.Stringify auf der Konsole drucke, zeigt es das Schlüssel/Wert-Paar richtig an, also denke ich, dass es korrekt zum Server geht, aber der Server/MVC3 mag es aus irgendeinem Grund nicht oder kann t es der Liste der PerfObjs zuordnen.
EDIT: Lösung
Maciej Antwort auf meinen Beitrag war, wie ich es gelöst. Was ich tat, war schließlich ein Arrays von perfObj auf der Client-Seite
$("#q_data").data(e,{key: e, perfVar: { qid: e, tmr: 0 }})
zu erstellen (ps - ignorieren redundante Verwendung von ‚e‘, habe ich andere Pläne hat, ist dies ein Dummy-Fall)
und dann habe ich es auf eine JSON freundliche Array abgebildet
var arr = [];
$.each($('#q_data').data(), function (i, e) {
var p = $(this).data(i);
var obj = { key: i, perfVar: { id: e.perfVar.qid, tmr: e.perfVar.tmr}};
arr.push(obj);
});
Zeichenfolge es dann
var q = JSON.stringify(arr);
.ajax'd $ i t wie in Maciejs Beitrag beschrieben.
ich richtig meine Klassen neu definiert
public class PerfObj
{
public string key { get; set; }
public PerfVar perfVar { get; set; }
}
public class PerfVar
{
public string id { get; set; }
public int tmr { get; set; }
}
und änderte die Signatur meiner Controller-Methode
[HttpPost]
public ActionResult Submit(PerfObj[] dict)
{
return PartialView("_DummyPartial");
}
Das jetzt perfekt funktioniert und ich kann meine Klassen ziemlich leicht zu tun verlängern, was ich will.
Danke euch allen!
Wenn Sie ein MVC-Modell an JSON binden möchten, versuchen Sie Folgendes: http://stackoverflow.com/questions/6405543/passing-json-list-to-mvc-3 – Clay
@clay - danke, dass wa s hilfreich – jeremy