MVC でのリモート検証
- モデル クラスには、プロパティを定義した名前空間 "System.Web.Mvc" が必要です。
using System.Web.Mvc;
[Required(ErrorMessage = "E-mail is required")]
[RegularExpression(@"^[a-zA-Z0-9_\.-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,6}$", ErrorMessage = "Email is not valid")]
[StringLength(30, ErrorMessage = "Email must not be more than 30 char")]
[Remote("IsEmailAvailable", "User", ErrorMessage = "E-mail already in use")]
public string Email { get; set; }
- コントローラーに IsEmailAvailable アクションを実装する必要があることを確認してください。
[HttpGet]
public JsonResult IsEmailAvailable(string email)
{
// Check if the e-mail already exists
return Json(!db.Users.Any(x => x.Email == email), JsonRequestBehavior.AllowGet);
}
- クライアント側の検証のために、この js を View に追加したことを確認してください。
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
また、web.config からクライアント側の検証を有効にします
<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
ノート:
リモート属性は、JavaScript が有効になっている場合にのみ機能します。エンド ユーザーが自分のマシンで JavaScript を無効にすると、検証は機能しません。これは、RemoteAttribute がサーバー側の検証メソッドに対して非同期の AJAX 呼び出しを行うために JavaScript を必要とするためです。その結果、ユーザーは適切な検証をバイパスしてフォームを送信できます。これが、サーバー側の検証が常に重要である理由です。
Javascriptが無効になっている場合:
サーバー側の検証を機能させるには、JavaScript が無効になっている場合、2 つの方法があります。
- コントローラー アクション メソッドにモデル検証エラーを動的に追加します。
- カスタム リモート属性を作成し、IsValid() メソッドをオーバーライドします。
コントローラー アクション メソッドにモデル検証エラーを動的に追加します。[HttpPost] 属性で装飾された Create アクション メソッドを次のように変更します。
[HttpPost]
public ActionResult Create(User user)
{
// Check if the Email already exists, and if it does, add Model validation error
if (db.Users.Any(x => x.Email == user.Email))
{
ModelState.AddModelError("Email", "Email already in use");
}
if (ModelState.IsValid)
{
db.Users.AddObject(user);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
この時点で、ブラウザーで JavaScript を無効にし、アプリケーションをテストします。クライアント側の検証は取得されませんが、フォームを送信するときにサーバー側の検証により、検証エラーがある場合はユーザーがフォームを送信できないことに注意してください。
ただし、検証を実行する責任をコントローラーのアクション メソッドに委譲すると、MVC 内の関心の分離に違反します。理想的には、すべての検証ロジックをモデルに含める必要があります。検証には、MVC モデルで検証属性を使用することをお勧めします。