2009-03-23 6 views
2

Je transmets json de ma vue à mes actions de contrôleur pour effectuer des opérations. Pour convertir le JSON envoyé en, à un POCO J'utilise ce filtre d'action:Relier l'application/json à l'objet POCO dans asp.net mvc, exception de sérialisation

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(); 
} 

}

Il utilise le DataContractJsonSerializer pour cartographier le JSON, à mon objet. Mon action est ensuite décorée comme ceci:

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

donc conjecturer, ce qui se passe ici, s'il y a un problème de sérialisation JSON au type d'objet (si une chaîne ne peut pas être analysée comme un type décimal ou similaire pour eg), il ajoute l'erreur à une collection, puis transmet cette erreur à la vue. Il peut alors vérifier si cette collection a des erreurs et rendre compte au client.

Le problème est que je ne peux pas sembler savoir quel champ a causé le problème. Idéalement, je voudrais revenir à la vue et dire "ce domaine" avait un problème. La classe SerializationException ne semble pas offrir ce genre de flexibilité.

Comment le collectif SO hivemind pourrait-il envisager de s'attaquer à ce problème?

Répondre

1

Je voudrais juste faire un post de formulaire ajax. C'est beaucoup plus facile.

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

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

+0

Cela se passe déjà via un post de formulaire ajax. – ChadT

+0

Ensuite, vous ne devriez pas avoir besoin de changer les données de publication à JSON. Il suffit de laisser les données de poste dans le corps de la requête http. –

+0

Malheureusement, ce n'est pas aussi simple que ça. – ChadT

1

Que diriez-vous ceci: Json.Net Il lit une chaîne JSON et Deserialises ensuite à l'objet POCO donné. Mais pour déterminer où des erreurs se produisent, je ne suis pas trop sûr.