このように、例えば:
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."]
もちろん、フィールド名やフィールドIDなどを追加するなど、好きな方法でエラーオブジェクト/リストを作成できます。
新しいエンティティのPOSTのような「一方向」のAjax呼び出しであっても、要求が成功したかどうかを示す何かを呼び出し元に返す必要があります。ユーザーが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
。