我有一个剑道窗口,用户可以在其中输入名称。我正在使用远程验证来检查数据库中是否存在名称,并且仅在名称不存在时才提交表单。
我正在使用 jQuery 验证插件 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>