2012-04-02 3 views
1

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!

+0

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

+0

@clay - danke, dass wa s hilfreich – jeremy

Antwort

3

Es gibt 3 Dinge falsch mit Ihrem Code:

A. Die Eigenschaft PerfVar öffentlich gemacht werden muss, und es muss eine get und setzen auf sie sein:

public class PerfObj { Öffentlichkeit Zeichenfolge id {get; einstellen; } public Perfvar perfVar {erhalten; einstellen; } }

B. Ihre JSON-Darstellung der Liste ist falsch. Es sollte sein:

var e = [ 
       { "id": "foo", "perfVar": { "qid": "a", "tmr": "b"}}, 
       { "id": "foo", "perfVar": { "qid": "a", "tmr": "b"}} 
      ]; 

C. Sie haben die Array stringify und Typ angeben: 'POST' es zu einem MVC-Controller über Ajax weitergeben müssen:

$.ajax({ 
       url: '/run/submit', 
       data: JSON.stringify(e), 
       contentType: 'application/json, charset=utf-8', 
       dataType: 'json', 
       type: 'POST', 
       success: function (data) { alert(data); } 
      }); 
+0

sehr klare Erklärung - arbeitete wie ein Charme. JSON/MVC in den Griff bekommen. Danke und ich habe die Antwort angenommen/upvoted. – jeremy

2

Sie können nicht direkt ein Schlüssel/Wert-Paar zu einer flachen Sequenz zuordnen. MVC hat keine Ahnung, wie das geht.

Sie benötigen entweder benutzerdefinierte Modellbinder, oder eine bessere/einfachere Option wäre zu ändern, wie Sie die JSON auf der Clientseite erstellen, so dass es tatsächlich zu Ihrem Modell entspricht.

Etwas wie folgt aus:

var perfObjs = 
{ 
    { id: 1, perfVar: { qId: 1, tmr: 0 }}, 
    { id: 2, perfVar: { qId: 2, tmr: 0 }}, 
} 
$.post("/run/submit", perfObjs, function(data) { alert(data);}, "application/json"); 
+0

Ich stimme der zweiten Option hier, warum inkonsistente Feldnamen? Wenn Sie sie konsistent halten, ist sie besser lesbar und Sie benötigen kein benutzerdefiniertes Modellbinderprogramm. – Terry

+0

@TerryB - vereinbart. Aber wollte dem OP nur die Option des Modellbinders geben, falls er auf der Client-Seite keine Kontrolle über den eigentlichen JSON hat. Einfach alle Basen abdecken. – RPM1984

+0

Guter Anruf. Wenn das aber der Fall ist ... Client-Entwickler entscheiden über die Datenstruktur? Twilight Zone !! (JK btw ich weiß, eine Menge Zeug kommt jetzt von öffentlichen APIs) – Terry

0

Da der Controller die json Wert als Liste nicht erkennt.

Warum nicht einfach die rohe Zeichenfolge an Ihren Controller übergeben und lassen Sie Ihren Controller die JSON-Zeichenfolge in Objekt konvertieren? das wird viel einfacher sein.

Verwandte Themen