2009-03-23 3 views
2

Ich übergebe json aus meiner Sicht zu meinen Controller-Aktionen, um Operationen durchzuführen. Zur Umwandlung der json in gesendet wird, zu einem POCO Ich verwende diese Aktion Filter:Bindung von Anwendung/JSON zu POCO-Objekt in asp.net MVC, Serialisierungsausnahme

public class ObjectFilter : ActionFilterAttribute { 
public Type RootType { get; set; } 

public override void OnActionExecuting(ActionExecutingContext filterContext) { 
IList<ErrorInfo> errors = new List<ErrorInfo>(); 
try { 
    object o = new DataContractJsonSerializer(RootType).ReadObject(filterContext.HttpContext.Request.InputStream); 
    filterContext.ActionParameters["postdata"] = o; 
    } 
catch (SerializationException ex) { 
    errors.Add(new ErrorInfo(null, ex.Message)); 
} 
finally { 
    filterContext.ActionParameters["errors"] = errors.AsEnumerable(); 
} 

}

Es ist die DataContractJsonSerializer mit dem JSON zu kartieren, zu meinem Ziel. Meine Aktion ist dann wie so eingerichtet:

[ObjectFilter(RootType = typeof(MyObject))] 
public JsonResult updateproduct(MyObject postdata, IEnumerable<ErrorInfo> errors) { 
    // check if errors has any in the collection! 
} 

So zu vermuten, was hier vor sich geht, wenn es ein Problem, die JSON auf die Art des Objekts Serialisierung (wenn eine Zeichenfolge nicht als Dezimalzahl Typ analysiert werden kann oder Ähnlich wie zB) fügt es den Fehler zu einer Sammlung hinzu und übergibt diesen Fehler dann an die Ansicht. Es kann dann prüfen, ob diese Sammlung Fehler aufweist, und dem Client Bericht erstatten.

Das Problem ist, dass ich nicht herausfinden kann, welche Feld hat das Problem verursacht. Idealerweise würde ich gerne zur Ansicht zurückkehren und sagen, "DIESES FELD" hatte ein Problem. Die SerializationException-Klasse scheint diese Flexibilität nicht zu bieten.

Wie würde das Kollektiv SO hivemind in Erwägung ziehen, dieses Problem anzugehen?

Antwort

1

Ich würde nur eine Ajax Form Post machen. Es ist viel einfacher.

http://plugins.jquery.com/project/form

http://malsup.com/jquery/form/

+0

Dies geschieht bereits über einen Ajax-Form-Post. – ChadT

+0

Dann sollten Sie die Postdaten nicht in JSON ändern müssen. Hinterlassen Sie einfach die Post-Daten im Hauptteil der http-Anfrage. –

+0

Leider ist es nicht so geradlinig wie das. – ChadT

1

Wie wäre es damit: Json.Net Es hat eine JSON-String liest und dann Deserialises es dem POCO gegebenen Objekt.

string jsonResult = GetJsonStringFromSomeService(); 
MyPocoObject myobject = JsonConvert.DeserializeObject<MyPocoObject>(jsonResult); 
Console.Write("Damn that is easy"); 

Aber für die Bestimmung, wo Fehler auftreten, bin ich mir nicht sicher.