Привязка приложения / json к объекту POCO в asp.net mvc, исключение сериализации - PullRequest
2 голосов
/ 23 марта 2009

Я передаю json обратно из моего представления в действия контроллера для выполнения операций. Чтобы преобразовать отправляемый JSON в POCO, я использую этот фильтр действий:

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

}

Он использует DataContractJsonSerializer для сопоставления JSON с моим объектом. Мое действие затем оформляется так:

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

Таким образом, чтобы догадаться, что здесь происходит, если существует проблема с сериализацией JSON к типу объекта (если строка не может быть проанализирована как десятичный тип или аналогично, например), она добавляет ошибку в коллекцию и затем передает эту ошибку до представления. Затем он может проверить, есть ли в этой коллекции ошибки, и сообщить об этом клиенту.

Проблема в том, что я не могу выяснить , какое поле вызвало проблему. В идеале я хотел бы вернуться к представлению и сказать, что у "ЭТОГО ПОЛЯ" возникла проблема. Класс SerializationException, по-видимому, не обеспечивает такой гибкости.

Как бы коллективный УЛ-разум мог решить эту проблему?

Ответы [ 2 ]

1 голос
/ 18 декабря 2009

Как насчет этого: Json.Net Он читает строку JSON и затем десериализует ее в заданный объект POCO.

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

Но для определения, где происходят ошибки, я не слишком уверен.

1 голос
/ 24 марта 2009

Я бы просто сделал пост в форме ajax. Это намного проще.

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

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

...