ASP.net MVC 3 jQuery 验证;禁用不显眼的 OnKeyUp?

Posted

技术标签:

【中文标题】ASP.net MVC 3 jQuery 验证;禁用不显眼的 OnKeyUp?【英文标题】:ASP.net MVC 3 jQuery Validation; Disable Unobtrusive OnKeyUp? 【发布时间】:2011-12-22 18:55:52 【问题描述】:

有没有办法禁用某个验证器(信用卡)的 jQuery 验证,以便它只发生在 onblur,而不是 onkeyup?

根据 jQuery Validator 文档,我认为我可以这样做:

$(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。

在表单中输入信用卡号并让它随机地从无效变为有效,然后又变为无效,这有点烦人。

有什么想法吗?谢谢!

【问题讨论】:

【参考方案1】:

好吧,伙计们,

我遇到了同样的问题,发现了这个帖子: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  );

您会看到您的信用卡字段仅在 blur 或 submit 上进行检查(但其余部分也在 keyup 上工作)。

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

【讨论】:

通过返回 false 来禁用 keyup 的绝妙技巧。 这是我发现的唯一能够抑制 keyup 验证的方法。当我为了验证输入而进行 ajax 调用时,这太过分了。最后,我在 input 元素上设置了一个 data 属性,该属性由 input 元素的 onchange 事件的 ajax 结果控制。这允许 jquery validate 有一个简单的返回 true 或 false,同时仍然向服务器发出请求以进行数据库验证。 有几个事件要抑制,我为它们做了一个简单的占位符var fnfalse = function() return false; ,然后用它来阻止功能,$(element).keyup(fnfalse).blur(fnfalse).focusout(fnfalse); 2018 年仍在工作!非常感谢,你拯救了我的一天。 链接失效了:(【参考方案2】:

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

要更改使用不显眼验证的表单上的设置,您可以执行以下操作:

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

【讨论】:

aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/… 这会禁用所有元素的 keyup 验证触发器,不是吗?他在问如何仅对 1 个元素禁用它。【参考方案3】:

我意识到这是一篇旧帖子,但似乎没有一个回复能回答这个问题,

如何禁用onkeyup和启用onblur?

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

正如 Ben Foster 所说,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();
            ;
        

【讨论】:

【参考方案4】:

不知道如何将其设置为特定字段,但您可以尝试禁用 keyup 验证(适用于所有字段):

$.validator.setDefaults(
   onkeyup: false
)

MVC 3 specifying validation trigger for Remote validation ASP.NET Remote Validation only on blur?

【讨论】:

是的,我看到了。我喜欢大多数字段,而不是信用卡字段或远程验证字段(我宁愿等到 onblur 访问网站,而不是每次更改字符时)。可能只是我必须忍受的限制。我可能会像你上面提到的那样做全局 setDefaults... ...起初我使用 以确保文档和脚本已加载并准备好使用,但它不起作用。我不得不把它拉出​​来让它工作,例如: 最终只是禁用了“onkeyup”【参考方案5】:

你也可以使用类似上面的东西,

$("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 对我帮助很大。

【讨论】:

【参考方案6】:

您可以在 credit 字段的 onfocus 事件中将默认设置为关闭,然后在 onblur 中将其打开。看起来很hacky,但可以工作。

【讨论】:

以上是关于ASP.net MVC 3 jQuery 验证;禁用不显眼的 OnKeyUp?的主要内容,如果未能解决你的问题,请参考以下文章

对 ASP.Net MVC 验证进行故障排除?电子邮件验证电话不

自定义 asp.net mvc 3 jquery.validate.unobtrusive

asp.net mvc jquery 下拉验证

asp.net mvc 3 - ajax 表单提交和验证

JQuery 验证忽略本地化文件 (ASP.NET MVC)

使用带有 jquery ajax 的 ASP.NET MVC 验证?