Я передаю 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, по-видимому, не обеспечивает такой гибкости.
Как бы коллективный УЛ-разум мог решить эту проблему?