Assim, por exemplo:
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);
}
}
Isso retornará uma resposta como esta (assumindo JSON, mas o mesmo princípio básico para 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."]
É claro que você pode construir seu objeto / lista de erro da maneira que desejar, por exemplo, adicionando nomes de campo, ID de campo etc.
Mesmo que seja uma chamada Ajax "unidirecional", como um POST de uma nova entidade, você ainda deve retornar algo ao chamador - algo que indica se a solicitação foi bem-sucedida ou não. Imagine um site onde seu usuário adicionará algumas informações sobre si mesmo por meio de uma solicitação AJAX POST. E se as informações que eles tentaram inserir não forem válidas - como eles saberão se a ação Salvar foi bem-sucedida ou não?
A melhor maneira de fazer isso é usando os bons e antigos códigos de status HTTP, como 200 OK
e assim por diante. Dessa forma, seu JavaScript pode lidar corretamente com as falhas usando os retornos de chamada corretos (erro, sucesso etc.).
Aqui está um bom tutorial sobre uma versão mais avançada deste método, usando um ActionFilter e jQuery: http://asp.net/web-api/videos/getting-started/custom-validation
System.Net.Http
,System.Net
System.Web.Http.Controllers
eSystem.Web.Http.Filters
.