2015-12-01 3 views
0

В настоящее время я создаю ASP Web API, и я выяснил, что если запросы выполняются с API, которые содержат пустые значения, я получаю «уродливые» исключения ошибок в ModelState что я не хочу показывать своим пользователям. Скажем, мое тело запроса выглядит следующим образом:ASP Web Api ModelState исключение, когда тип значения равен нулю

{ "Id": "", "Имя": "", "Описание": "", "Дата создания": "", "UserId": "" , "AmountOfUsers": "", "MinimumAmountOfUsers": "", "Адрес": "", "Активированный": "", "CategoryId": "", "Дата": ""}

Тогда я буду получать следующее ModelState исключение для Id:

Error converting value {null} to type 'System.Int32'. Path 'Id', line 1, position 9

То же GOE s для всех других типов значений.

У меня есть аннотация для [Required] данных (с пользовательскими сообщениями об ошибках) для этих полей в моей модели, но это, похоже, не делает трюк.

Теперь я задаюсь вопросом, какое решение лучше всего решить. Все модели, которые пользователи отправляют/ставят, представляют собой модели просмотра, поэтому я думал о том, чтобы сделать все типы значений нулевыми, а затем отбросить их потом, когда я сопоставляю их с моделями баз данных. Я не уверен, есть ли лучшие решения, и поэтому я хотел бы услышать ваши мнения.

+0

Check для [действительного состояния модели] (http://stackoverflow.com/questions/11686690/handle-modelstate-validation-in-asp-net -web-api) и вернуть соответствующий ответ. Когда вы получаете это исключение? Как выглядит модель модели? – Jasen

ответ

0

Можно контролировать детали ошибки во всем мире путем модификации IncludeErrorDetailPolicy в Web API конфигурации

https://msdn.microsoft.com/en-us/library/system.web.http.includeerrordetailpolicy(v=vs.118).aspx

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never;

В качестве альтернативы вы можете проверить наличие исключений в методе действий и контролировать ответ, который отправляется обратно клиенту

Также можно создать глобальный фильтр исключений для управления подробно

public class MyExceptionHandler : IExceptionHandler { 
    context.Result = new StatusCodeResult(HttpStatusCode.InternalServerError, context.Request); 
    return Task.FromResult<object>(null); 
    } 

Тогда зарегистрировать этот фильтр в конфигурации

config.Services.Replace(typeof(IexceptionHandler), new MyExceptionHandler());