In questo modo, ad esempio:
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);
}
}
Questo restituirà una risposta come questa (assumendo JSON, ma lo stesso principio di base per 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."]
Ovviamente puoi costruire il tuo oggetto / elenco di errore nel modo che preferisci, ad esempio aggiungendo nomi di campo, ID di campo ecc.
Anche se è una chiamata Ajax "unidirezionale" come un POST di una nuova entità, dovresti comunque restituire qualcosa al chiamante, qualcosa che indichi se la richiesta ha avuto successo o meno. Immagina un sito in cui il tuo utente aggiungerà alcune informazioni su se stesso tramite una richiesta AJAX POST. Cosa succede se le informazioni che hanno cercato di inserire non sono valide, come fanno a sapere se la loro azione di salvataggio ha avuto successo o meno?
Il modo migliore per farlo è utilizzare Good Old HTTP Status Code come 200 OK
e così via. In questo modo il tuo JavaScript può gestire correttamente gli errori utilizzando i callback corretti (errore, successo, ecc.).
Ecco un bel tutorial su una versione più avanzata di questo metodo, utilizzando un 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
.