ユーザーが名前を入力する剣道ウィンドウがあります。リモート検証を使用して、名前がデータベースに存在するかどうかを確認し、名前が存在しない場合にのみフォームを送信しています。
jQuery Validation Plugin v1.10.0 を使用しています。同じリモート検証アクションが通常のビューで問題なく使用されます。しかし、剣道ウィンドウ (部分ビュー) では、次の問題があります。
1) フォームの送信時にリモート検証が起動しません。キーアップ イベントとフォーカス アウトでのみ機能します。これは、IE (IE 8) と Chrome の両方で発生します。
2) IE (IE 8) では、検証はキーを押したときにのみ起動し、名前の後にスペースを押したときにのみ起動します。では、'John' という名前が無効であるとしましょう。「John」と入力しても検証メッセージは表示されませんが、「John」の後にスペースを押すと表示されます。また、バックスペースを使用すると、リモート検証が起動しません。
この問題の原因について何か考えはありますか?
ビューモデル:
public class MyViewModel
{
public int ID { get; set; }
[Required]
[Remote("IsNameAvailable", "MyController", ErrorMessage = "The Name already exists.")]
public string Name { get; set; }
}
コントローラ:
public ActionResult IsNameAvailable(Portfolio portfolio)
{
var exists = // code to check if Name exists;
return Json(!exists, JsonRequestBehavior.AllowGet);
}
public ActionResult ShowDialog(int id)
{
var viewModel = new MyViewModel { ID = id };
return PartialView("_Dialog", viewModel);
}
部分図 (剣道ウィンドウで表示):
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.ID)
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.Name)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.Name)
</div>
<p>
<input type="submit" value="Save" />
</p>
}
メイン ビュー:
@(Html.Kendo().Window().Name("dialog")
.Title("Dialog")
.Visible(false)
.Modal(true)
.Draggable(true)
.Width(300)
.Events(events => events.Refresh("onRefresh"))
)
<script type="text/javascript">
function showDialog(id) {
var wnd = $("#dialog").data("kendoWindow");
var url = '@Url.Action("ShowDialog", "MyController")';
wnd.refresh(
{
url: url,
data: { id: id}
});
wnd.center().open();
}
function onRefresh(e) {
$.validator.unobtrusive.parse($("#dialog"));
$.validator.setDefaults({
onkeyup: true,
onfocusout: true,
onsubmit: true
});
var form = $("#dialog").find('form');
form.submit(function () {
if (form.validate().valid()) {
var wnd = $("#dialog").data("kendoWindow");
wnd.close();
}
});
}
</script>