2014-11-06 56 views
0

我有我的ASP MVC项目和jQuery客户端验证的一个问题。 问题是,当按下提交按钮时,表单被验证,但错误没有显示,表单被提交。 只有在验证方法中调用valid()时才会出现问题。 例如:我有一个isdatebefore和isdate之后的验证方法。 我想检查#start是否在#end之前。 因此,验证#start时,它也会在#end上进行验证,以确保错误消息在两个元素上都显示/消失。 我添加了验证onfocusout,这工作得很好(在#start和#ejnd字段和表单中的所有其他字段)。 但是,当我按下提交按钮,表单被验证(我放置了一些断点,以查看方法是否被调用),但提交,虽然存在错误。ASP MVC jQuery验证onfocusout在工作,但不能在表单提交

这里是我的代码:

// Add IsDateAfter validation 
$.validator.addMethod("isdateafter", function (value, element, params) { 
    var self = $(element); 
    var parts = element.name.split("."); 
    var prefix = ""; 
    for (var i = 0; i < parts.length - 1; i++) 
     prefix = parts[i] + "."; 
    var otherElement = $('input[name="' + prefix + params.propertytested + '"]'); 
    var startdatevalue = otherElement.val(); 
    if (!value || !startdatevalue) 
     return true; 
    var allowequal = params.allowequaldates.toLowerCase() === "true"; 
    var start = Globalize.parseDate(startdatevalue); 
    var end = Globalize.parseDate(value); 
    if (!self.data('reval')) { 
     self.data('reval', true); 
     otherElement.data('reval', true); 
     otherElement.valid(); 
     self.data('reval', false); 
     otherElement.data('reval', false); 
    } 
    var isValid = allowequal ? start <= end : 
     start < end; 
    if (isValid) { 
     self.removeClass('input-validation-error'); 
    } 
    return isValid; 
}); 

$.validator.unobtrusive.adapters.add(
    'isdateafter', ['propertytested', 'allowequaldates'], function (options) { 
     options.rules['isdateafter'] = options.params; 
     options.messages['isdateafter'] = options.message; 
    }); 

// Add IsDateBefore validation 
$.validator.addMethod("isdatebefore", function (value, element, params) { 
    var self = $(element); 
    var parts = element.name.split("."); 
    var prefix = ""; 
    for (var i = 0; i < parts.length - 1; i++) 
     prefix = parts[i] + "."; 
    var otherElement = $('input[name="' + prefix + params.propertytested + '"]'); 
    var startdatevalue = otherElement.val(); 
    if (!value || !startdatevalue) 
     return true; 
    var allowequal = params.allowequaldates.toLowerCase() === "true"; 
    var start = Globalize.parseDate(startdatevalue); 
    var end = Globalize.parseDate(value); 
    if (!self.data('reval')) { 
     self.data('reval', true); 
     otherElement.data('reval', true); 
     otherElement.valid(); 
     self.data('reval', false); 
     otherElement.data('reval', false); 
    } 
    var isValid = allowequal ? start >= end : 
     start > end; 
    if (isValid) { 
     $(element).removeClass('input-validation-error'); 
    } 
    return isValid; 
}); 

$.validator.unobtrusive.adapters.add(
    'isdatebefore', ['propertytested', 'allowequaldates'], function (options) { 
     options.rules['isdatebefore'] = options.params; 
     options.messages['isdatebefore'] = options.message; 
    }); 

代码工作正常与onfocusout在事件,但有问题文称为onsubmit事件里。 当我删除调用otherElement.valid();一切工作再次(但我需要验证其他元素,使其正常工作)。

所以没有任何人知道我可以保持一个验证时验证这两个元素仍然有它不提交搞砸了?

+0

如何提交表单?使用 – chiapa 2014-11-06 11:16:52

+0

一个简单的按钮:<按钮类型= “提交”>保存 – wertzui 2014-11-06 11:28:19

+0

您是否尝试过'<按钮类型= “提交” 的onclick = “返回validateForm()”>保存'?在'validateForm()'函数中,你可以检查表单的有效性 – chiapa 2014-11-06 11:52:37

回答

1

您不能从另一个jQuery验证方法中使用的.valid()方法。

Use .element() instead ...

$('#yourForm').validate().element(otherElement); 

或使用关键字this,这表示从插件的自己的方法中validator对象...

this.element(otherElement); 

或作为您已经确认为工作(有些重复,如果this关键字的工作)...

otherElement.parents('form').validate().element(otherElement); 
+0

感谢您指点我正确的方向!但是你必须调用otherElement.parents('form')。validate()。element(otherElement);因为元素方法是连接到表单的验证程序的成员。如果你编辑你的答案,我会高兴地接受它:) – wertzui 2014-11-06 15:45:57

+0

@wertzui,是的,你当然是对的。我只是测试它,'this'关键字也代表方法中的'validator'对象。 – Sparky 2014-11-06 16:05:52

+0

再次具有与它trouple后,我发现,使用'this.element(otherElement);''调用this.prepareElement(元件);'它调用'this.reset();'。因此,如果之前已经验证过的字段(即在之前的HTML标记中)已被标记为无效,那么这将打破提交验证,因为this.reset();将清除this.errorList。因此,不要使用'this.element(otherElement);'你必须使用'this.check(otherElement);' – wertzui 2015-04-14 08:09:43