[Remote]
サーバーにAJAXリクエストを送信することで、この検証を実行できる属性を使用できます。アイデアは、検証のために呼び出されるコントローラーアクションを示すRemote属性でビューモデルのEmailプロパティを装飾することです。
[Remote("IsEmailAvailable", "Validation")]
public string Email { get; set; }
次に、この検証を実行するためのコントローラーアクションを記述します。
public ActionResult IsEmailAvailable(string email)
{
if (CheckEmailAvailability(email))
{
return Json(true, JsonRequestBehavior.AllowGet);
}
return Json("Sorry, the specified email is already taken", JsonRequestBehavior.AllowGet);
}
次に、ビュー内に対応するフィールドがあります。
<div>
@Html.LabelFor(x => x.Email)
@Html.EditorFor(x => x.Email)
@Html.ValidationMessageFor(x => x.Email)
</div>
ユーザーが最後に電子メールが利用可能かどうかを確認してからフォームが送信されるまでの間に、フォームを送信するコントローラーアクション内で同じチェックを実行する必要があることに注意してください。電子メールはすでに他の誰かによって取られている可能性があります:
[HttpPost]
public ActionResult ProcessFormSubmit(MyViewModel model)
{
// Warning this will not call the validation controller action specified
// by the Remote attribute
if (!ModelState.IsValid)
{
return View(model);
}
// now make sure you check for the email
if (!CheckEmailAvailability(email))
{
// the email is already taken
return View(model);
}
// at this stage the model is valid => you could process it
...
}