2011-11-05 131 views
24

有没有一种方法可以禁用某个验证器(信用卡)的jQuery验证,以便它只发生onblur而不是onkeyup?ASP.net MVC 3 jQuery验证;禁用Unobtrusive OnKeyUp?

基于jQuery的验证文档,我想我可以做这样的事情上:

$(function() { 
    $("[data-val-creditcard]").validate({ 
     onkeyup: false 
    }) 
}); 

但是,它似乎并不奏效。

我也想这样做对我的验证如下:

public class CreditCardValidator : DataAnnotationsModelValidator<CreditCardAttribute> 
{ 
    string _message; 

    public CreditCardValidator(ModelMetadata metadata, ControllerContext context, CreditCardAttribute attribute) 
     : base(metadata, context, attribute) 
    { 
     _message = attribute.ErrorMessage; 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = _message, 
      ValidationType = "creditcard" 
     }; 
     rule.ValidationParameters.Add("onkeyup", false); 
     return new[] { rule }; 
    } 
} 

它也不管用,但我只是采取了刺在适当的使用ValidationParameters的。

在表格中输入信用卡号码并将其从无效更改为有效,然后返回无效是一种恼人的做法。

任何想法?谢谢!

回答

17

玉家伙,

我在同样的问题,发现这个线程:http://old.nabble.com/-validate--onkeyup-for-single-field-td21729097s27240.html

的想法基本上是覆盖keyup事件并返回false。因此,在特定情况下,你需要添加:

$('#my-form').validate({ 
    rules: { 
    [...] 
    } 
} 
// Disable keyup validation for credit card field 
$("[data-val-creditcard]").keyup(function() { return false }); 

,你会看到您的信用卡字段只检查了模糊或提交(但其余正在KEYUP也)。

我正在寻找相同的解决方案,并发现这里的答案可以改进,所以我认为这将是很好的分享它在这里。

+2

意想不到的提示通过返回false来禁用keyup。 – Sam

+0

这是我发现的唯一能够抑制密钥验证的方法。这是过分的,因为我正在做一个Ajax调用,以验证输入。最后,我在输入元素上设置了一个数据属性,该元素由输入元素的onchange事件的ajax结果控制。这使得jquery验证有一个简单的返回true或false,同时仍然向服务器请求数据库验证。 –

+1

有几个事件要压制,我为它们做了一个简单的占位符,'var fnfalse = function(){return false; },然后用它来阻止功能,'$(element).keyup(fnfalse).blur(fnfalse).focusout(fnfalse);'。 –

5

不知道如何将它设置为一个特定的领域,但你可以试试这个禁用KEYUP验证(所有字段):

$.validator.setDefaults({ 
    onkeyup: false 
}) 

+0

是的,我看到了。我喜欢它在大多数领域,只是不是信用卡领域或远程验证领域(我宁愿等一次onblur而不是每次改变角色都要打网站)。可能只是我必须忍受的限制。我可能会做像上面提到的全局setDefaults ... – Sam

+0

...起初我使用以确保文档和脚本已加载并准备好使用,但不起作用。我不得不把它拿出来使用,例如:。但是,我想知道如果用户还没有完成下载脚本会发生什么。我把它们放在文档的底部而不是放在头部。 – Sam

+0

结束了只是禁用“onkeyup” – Sam

0

您可以在onfocus中将默认值设置为off信用领域的事件,然后在onblur中把它们变成。似乎哈克,但可以工作。

20

$.validator.setDefaults不适用于不显眼的验证,因为验证程序是在内部初始化的。

要改变对使用不引人注目的验证方式的设置,你可以做到以下几点:

var validator = $("form").data("validator"); 
if (validator) { 
    validator.settings.onkeyup = false; // disable validation on keyup 
} 
+0

http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3583148-update-jquery-validate-unobtrusive-implementation- –

+0

这将禁用所有元素的键控验证触发器,不是?他只问一个元素如何禁用它。 – TweeZz

9

我意识到这是一个老帖子,但没有响应的出现来回答这个问题,

如何禁用onkeyup并启用onblur?

我一直在寻找这个想法,我会分享答案。

正如福斯特所说的那样,的onkeyup可以通过执行以下

var validator = $("form").data("validator"); 
if (validator) { 
    validator.settings.onkeyup = false; 
} 

为了实现验证的onblur我们可以使用onfocusout在

validator.settings.onfocusout = function(element) 
{ 
    $(element).valid(); 
}; 

所以我们的代码以禁用的onkeyup并启用的onblur看起来被禁用像这样

var validator = $("form").data("validator"); 
     if (validator) 
     { 
      validator.settings.onkeyup = false; 
      validator.settings.onfocusout = function(element) 
      { 
       $(element).valid(); 
      }; 
     } 
1

你也可以用上面的东西,

$("form").validate({ 
    onfocusout: false, 
    onkeyup: false 
}); 

如果你有那么自定义规则,

$("form").validate({ 
    onfocusout: false, 
    onkeyup: false, 
    rules: { 
     "name1": { 
      required: true, 
      email: true, 
      maxlength: 100 
     }, 
     "name2": { 
      required: true, 
      number: true 
     } 
    } 
}); 

在jQuery的论坛This answer帮了我很多。