Jquery MVC4不引人注目的验证不';t等待远程验证完成
我的ASP.NET MVC4应用程序在模型中定义了远程验证规则,并在控制器方法中实现。我的表单将动态添加到页面中。因此,我使用以下代码触发验证Jquery MVC4不引人注目的验证不';t等待远程验证完成,jquery,validation,asp.net-mvc-4,Jquery,Validation,Asp.net Mvc 4,我的ASP.NET MVC4应用程序在模型中定义了远程验证规则,并在控制器方法中实现。我的表单将动态添加到页面中。因此,我使用以下代码触发验证 $(tabId).on("submit", formId, function (event) { event.preventDefault(); var form = $(this); form.removeData("validator"); $.validator.unobtrusive.
$(tabId).on("submit", formId, function (event) {
event.preventDefault();
var form = $(this);
form.removeData("validator");
$.validator.unobtrusive.parse(form);
if (form.valid())
{
// form submission
// THIS part executes even though the remote validation returns false
}
return false;
});
它启动远程验证,不等待完成,然后提交表单。如果任何其他字段无效(例如,name是必填字段),则会停止提交。但是,它不会等待远程验证
$(tabId).on("submit", formId, function (event) {
event.preventDefault();
var form = $(this);
form.removeData("validator");
$.validator.unobtrusive.parse(form);
if (form.valid())
{
// form submission
// THIS part executes even though the remote validation returns false
}
return false;
});
我在某处找到了一些工作,例如和。但是,只有在页面中定义了jQuery验证规则时,这些规则才起作用。但是,我使用的是MVC4模型验证规则。因此,我不想再次在我的视图页面中重新定义规则
有什么解决方法吗?你应该在表单添加到页面后立即调用
$.validator.unobtrusive.parse(表单)
。在提交事件中调用它是不正确的,很可能是您的问题。Validator and Untrusive做的一件事是为您捕获这些事件,由于Untrusive的工作方式,如果您想在成功提交时做特定的事情,您必须偷偷地将自己连接到submitHandler
,如下所示:
$('#nameForm').data('validator').settings.submitHandler = function(form){
alert('successful submit');
//do AJAX submit here
return false; //otherwise page will get reloaded
};
我已经为您做了一个工作示例,但是请注意,由于jsfiddle的工作方式,执行AJAX调用有点困难,因此我必须添加一个名为html
的隐藏字段,如果在true和false之间更改的值,您可以看到不同的行为
您可以附加到,并确保在提交表单时没有任何内容等待答复。未经测试的,未经测试的
var isInAjaxCall = false;
var queuedFuncs = [];
$(function() {
$(document).bind("ajaxStart", function () {
isInAjaxCall = true;
}).bind("ajaxStop", function () {
isInAjaxCall = false;
while(queuedFuncs.length > 0){
queuedFuncs.shift();
}
});
});
function SubmitForm() {
if (isInAjaxCall) {
queuedFuncs.push('SubmitForm');
return false;
}
var form = $('#form');
form.removeData("validator");
$.validator.unobtrusive.parse(form);
if (form.valid()) {
// form submission
}
return false;
}
您可以在验证器上使用pendingRequest变量,查看表单尝试提交时是否仍有任何挂起
$(tabId).on("submit", formId, function (event) {
event.preventDefault();
var form = $('#formid');
form.removeData("validator");
$.validator.unobtrusive.parse(form);
if (form.valid() && form.data('validator').pendingRequest == 0)
{
// form submission
}
return false;
});
如果要在字段验证时向用户显示消息,可以使用startrequest和stopRequest功能:
$(function(){
var validator = $('#formid').data('validator');
var oldStartRequest = validator.startRequest;
validator.startRequest = function (element) {
console.log(element.name + ' has begun validating')
oldStartRequest.apply(this, arguments);
};
var oldStopRequest = validator.stopRequest;
validator.stopRequest = function (element, valid) {
console.log(element.name + ' has finished validating');
console.log(element.name + ' is valid: ' + valid)
oldStopRequest.apply(this, arguments);
};
});
我在这里的帖子提供了解决方案,但必须有更好的方法:
在
if(form.valid())
之前,您是否尝试调用form.validate()
?是的,我尝试了form.validate()
。没用。@n锁定你找到解决办法了吗?我正在寻找它的解决方案。如何处理有效/无效表单,而不破坏验证/不引人注目的工作方式