Удаление исключений из сериализации JSON.net из ModelState

Основная проблема

Чтобы избавиться от дублирования логики проверки, я следую примеру нажатия на ошибку Server ModelState в моей модели просмотра (MVVM KnockoutJS).

Итак, по соглашению my Property Names на моем KO ViewModel Сопоставьте свойства, которые мой Api разоблачает и ожидает, поэтому я могу легко сопоставить один с другим с помощью небольшого плагина Knockout, который я написал.

<validation-summary params="vm: $data, class: 'alert alert-error'"></validation-summary>

...

<div class="control-group" data-bind="errorCss: {'error': spend }">
     <label class="control-label" for="spend">Spend</label>
     <div class="controls">
        <div class="input-prepend">
           <span class="add-on">$</span>
           <input type="text" data-bind="value: spend" id="spend" class="input-medium" placeholder="Spend USD" />
         </div>   
          <validation-message params="bind: spend, class: 'text-error'"></validation-message>
      </div>
</div>

Проблема

Проблема для меня в том, что когда JSON.Net сериализует JSON, я отправляю через AJAX и когда он встречает исключение, он добавляет это к ModelState as и Exception в класс ModelError.

Пример ответа:

{
  "message": "The request is invalid.",
  "modelState": {
    "cmd.spend": [
      "Error converting value \"ii\" to type 'System.Double'. Path 'spend', line 1, position 13.",
      "'Spend' must be greater than '0'."
    ],
    "cmd.Title": [
      "'Title' should not be empty."
    ]
 }
}

Проблема В том, что это сообщение не дает отличного UX:

Error converting value "ii" to type 'System.Double'. Path 'spend', line 1, position 13.

И тот факт, что я не могу отделить это сообщение исключения от моих сообщений проверки, поскольку все они находятся в одном массиве.

Я бы предпочел удалить это и обработать этот вопрос в моем ValidationClass

Я могу удалить их вручную, как это, и это в ActionFilter, поэтому я только один раз.

public class ValidateCommandAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            ModelStateDictionary modelState = actionContext.ModelState;

            #if !DEBUG
                for (int i = 0; i < modelState.Values.Count; i++)
                {
                    ModelErrorCollection errors = modelState.ElementAt(i).Value.Errors;
                    for (int i2 = 0; i2 < errors.Count; i2++)
                    {
                        ModelError error = errors.ElementAt(i2);
                        if (error.Exception != null)
                        {
                            // TODO: Add Log4Net Here
                            errors.RemoveAt(i2);
                        }
                    }
                }
            #endif

            if (!modelState.IsValid)
                actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState); 
        }
    }

Я знаю, что JSON.Net очень настраивается и хочет знать, есть ли где-нибудь в API для него, где я могу отключить это или подавить его?

Ответ 1

Вы можете установить обработчик ошибок. Например (из документов json.net),

List<string> errors = new List<string>();

List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(@"[
      '2009-09-09T00:00:00Z',
      'I am not a date and will error!',
      [
        1
      ],
      '1977-02-20T00:00:00Z',
      null,
      '2000-12-01T00:00:00Z'
    ]",
    new JsonSerializerSettings
    {
        Error = delegate(object sender, ErrorEventArgs args)
        {
            errors.Add(args.ErrorContext.Error.Message);
            args.ErrorContext.Handled = true;
        },
        Converters = { new IsoDateTimeConverter() }
    });

// 2009-09-09T00:00:00Z
// 1977-02-20T00:00:00Z
// 2000-12-01T00:00:00Z

// The string was not recognized as a valid DateTime. There is a unknown word starting at index 0.
// Unexpected token parsing date. Expected String, got StartArray.
// Cannot convert null value to System.DateTime.