2010-01-26 17 views
10

Ich mag JSON senden können, als den Standardquerystrings im Gegensatz, wenn ein Beitrag zu meinem Controller in ASP.Net MVC zu machen. Ich habe die Front-End-Sachen in Ordnung (bauen und dann meine JSON-Objekte einreichen).ASP.Net MVC: Senden von JSON-Controller

Das Problem ist auf der Steuerungsseite, wo der Standard-Modelbinder, die mit dem MVC-Framework versenden dies nicht unterstützen.

Ich habe eine Kombination von Möglichkeiten gesehen, eine davon ist das Anwenden eines Filters, der das Objekt als Parameter verwendet, eine JSON-Bibliothek zum Deserialisieren verwendet und diese zu den Aktionsparametern hinzufügt. Das ist nicht ideal.

Die andere, besser, Art und Weise ist ein eigenes Modell Binder zu verwenden. Alle, die ich gesehen habe, gehen jedoch davon aus, dass Sie nur ein Modell haben werden, und das wird eher eine Klasse als eine Variable sein. Wenn Sie mehrere haben, bricht es zusammen.

Hat jemand anderes dies gefunden? Eine Idee, die ich hatte, war, wenn ich einfach überschreiben könnte, wie MVC mit der FormCollection handelt und dort abfängt, die Werte der Sammlung selbst hinzufüge und hoffe, MVC kann den Rest auf seine normale Art erledigen. Weiß jemand, ob das möglich ist?

Die zentrale Frage, denke ich, ist, dass mein Problem ist nicht verbindlich, weil meine Ansicht Modelle sind nicht anders, wie sie vor, wo. Das Problem besteht darin, die Werte von JSON Post zu erhalten.

Wenn ich richtig bin MVC bekommen ist die Werte aus der Abfrage-Zeichenfolge und legt sie in die Form Sammlung, die dann für ModelBinding verwendet wird. Sollte also nicht die richtige Methode sein, um die Art der Zuweisung der FormCollection zu ändern?

Beispiel einer Aktion:

public ActionResult MyFirstAction(Int32 ID, PersonObject Person, ClassObject ClassDetails) 
{ 
//etc 
} 

Die normale Bindung funktioniert, ist JSON nicht und alle das Beispiel von Modell Binder wird nicht funktionieren. Meine beste Lösung ist bisher, das Objekt in ein Dictionary zu konvertieren und jeden Param umzuschleifen. Scheint nicht ideal.

+0

Wenn Sie gehen, um diesen nach unten stimmen, warum erklären könnte? – Damien

+0

Entschuldigung, leider, als ich ging, um den Lieblingsstar zu klicken, klickte ich versehentlich auf die Down-Abstimmung, auch nachdem ich sie bereits upvoted hatte (deshalb ging es von 5 auf 3). Und jetzt sagte es sofort nach dem Versuch, das rückgängig zu machen, was ich versehentlich getan hatte, dass es zu spät war, meine Stimme zu ändern, es sei denn, die Frage wurde bearbeitet. Wenn Sie die Frage bearbeiten, werde ich gerne meine Stimme korrigieren. – jamesaharvey

+0

Kein Problem! Das passiert mir auch oft. – Damien

Antwort

8

Ich verwende ein benutzerdefiniertes Modell Bindemittel für json wie folgt aus:

public class JsonModelBinder<T> : IModelBinder { 
    private string key; 

    public JsonModelBinder(string requestKey) { 
     this.key = requestKey; 
    } 

    public object BindModel(ControllerContext controllerContext, ...) { 
     var json = controllerContext.HttpContext.Request[key]; 
     return new JsonSerializer().Deserialize<T>(json); 
    } 
} 

Und es dann in Global.asax.cs wie folgt verdrahten:

ModelBinders.Binders.Add(
    typeof(Product), 
    new JsonModelBinder<Product>("ProductJson")); 

Sie können mehr über diese lesen Sie hier : Inheritance is Evil: The Epic Fail of the DataAnnotationsModelBinder

EDIT

Der JsonModelBinder sollte für den Controller-Aktionsparameter verwendet werden, der nur als Produkt eingegeben wird. Das Int32 und das ClassObject sollten auf den DefaultModelBinder zurückgreifen. Haben Sie ein anderes Ergebnis?

+0

Sie müssten also definieren, für welche Typen es verwendet werden soll? – Damien

+0

Ja, Sie müssen die Typen angeben. Kannst du deine Situation etwas genauer beschreiben? Ich habe in letzter Zeit mehr in die Modellbindung gegraben und es gibt eine Menge nicht offensichtlicher Funktionalität darin. –

+0

Gut mit den Typen, was mache ich mit Aktionsparametern, die primitive Typen/Stiche sind? Wenn ich Int32 ID, Class Product sende, entsteht ein Problem – Damien

Verwandte Themen