ValidationController アクションがトリガーされない理由を突き止めようと、私は頭を悩ませてきました。
プロジェクト全体の web.config で設定を有効にしています。
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
私は次のコントローラーを持っています:
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public class ValidationController : Controller
{
private readonly IUserRepository userRepository;
public ValidationController(IUserRepository userRepository)
{
this.userRepository = userRepository;
}
public JsonResult IsUserNameAvailable(string username)
{
User user = userRepository.Get(u => u.UserName == username);
if (user == null) return Json(true, JsonRequestBehavior.AllowGet);
else return Json(false, JsonRequestBehavior.AllowGet);
}
}
および次のビューモデル:
[Required(ErrorMessage = "Required *")]
[StringLength(50, MinimumLength = 4, ErrorMessage = "Please keep the username between four and twenty character.")]
[Remote("IsUserNameAvailable", "Validation", ErrorMessage = "A user with this username already exists.")]
[Display(Name = "Username")]
public string UserName { get; set; }
そして、フォームに次のフィールドがあります。
<form id="registerForm">
...
@Html.ValidationMessageFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.LabelFor(m => m.UserName)
</form>
私は ajax フォームの送信を行っており、サーバー側の検証は完全に機能しています。
$.post("/Account/Register", $('#registerForm').serialize(), function(){
updateFormWithServerGeneratedErrors();
})
サーバーは私のフィールドに正しい入力タグを生成しましたが:
<input ... data-val-remote-url="/Validation/IsUserNameAvailable" data-val-remote-additionalfields="*.UserName" data-val-remote="A user with this username already exists." ... >
「/Validation/IsUserNameAvailable?username=SomeName」という URL に入力して手動でアクションを実行できますが、Fiddler は、キーを押したりフォーカスを変更したりしたときに、この URL に対して行われたリクエストを表示しません。
このチュートリアルによると、これを機能させるために JavaScript を記述する必要はありません。はい、フォームをいじり始めるまでに、jquery.validate.js および jquery.validate.unobtrusive.js スクリプトが既に読み込まれています。
ここで何が問題なのですか?