Вот так, например:
public HttpResponseMessage Post(Person person)
{
if (ModelState.IsValid)
{
PersonDB.Add(person);
return Request.CreateResponse(HttpStatusCode.Created, person);
}
else
{
// the code below should probably be refactored into a GetModelErrors
// method on your BaseApiController or something like that
var errors = new List<string>();
foreach (var state in ModelState)
{
foreach (var error in state.Value.Errors)
{
errors.Add(error.ErrorMessage);
}
}
return Request.CreateResponse(HttpStatusCode.Forbidden, errors);
}
}
Это вернет такой ответ (при условии JSON, но тот же базовый принцип для XML):
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
(some headers removed here)
["A value is required.","The field First is required.","Some custom errorm essage."]
Вы, конечно, можете создать свой объект / список ошибок любым способом, например, добавив имена полей, идентификаторы полей и т. Д.
Даже если это «односторонний» вызов Ajax, такой как POST нового объекта, вы все равно должны вернуть что-то вызывающему - что-то, что указывает, был ли запрос успешным. Представьте себе сайт, на котором ваш пользователь добавит информацию о себе с помощью запроса AJAX POST. Что делать, если информация, которую они пытались ввести, недействительна - как они узнают, было ли их действие сохранения успешным или нет?
Лучший способ сделать это - использовать старые добрые коды состояния HTTP, например, 200 OK
и так далее. Таким образом, ваш JavaScript может правильно обрабатывать сбои, используя правильные обратные вызовы (ошибка, успех и т. Д.).
Вот хороший учебник по более продвинутой версии этого метода с использованием ActionFilter и jQuery: http://asp.net/web-api/videos/getting-started/custom-validation
System.Net.Http
,System.Net
System.Web.Http.Controllers
иSystem.Web.Http.Filters
.