2011-11-05 15 views
24

C'è un modo per disattivare la convalida jQuery per un determinato validatore (carta di credito) in modo che si verifichi solo onblur, invece di onkeyup?ASP.net MVC 3 jQuery Validation; Disabilita OnKeyUp non invadente?

Sulla base della documentazione jQuery Validator ho pensato che avrei potuto fare qualcosa di simile:

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

Tuttavia, non sembra funzionare.

Inoltre ho provato a fare il seguente sul mio validatore:

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 }; 
    } 
} 

Non funziona neanche, ma stavo solo prendendo una pugnalata al l'uso appropriato di ValidationParameters.

È piuttosto fastidioso immettere un numero di carta di credito in un modulo e modificarlo casualmente da valido a non valido, quindi tornare a non valido.

Qualche idea? Grazie!

risposta

17

Ok ragazzi,

ero nello stesso problema ed ho trovato questa discussione: http://old.nabble.com/-validate--onkeyup-for-single-field-td21729097s27240.html

L'idea è sostanzialmente quella di sovrascrivere l'evento KeyUp e restituire false. Quindi nel tuo caso specifico è necessario aggiungere:

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

E vedrete che il vostro campo di carta di credito viene verificata solo su sfocatura o inviare (ma il resto sta lavorando su keyup anche).

Stavo cercando la stessa soluzione e ho trovato che la risposta qui potrebbe essere migliorata, quindi ho pensato che sarebbe stato bello condividerla qui.

+2

Consiglio fantastico sulla disabilitazione della chiave restituendo false. – Sam

+0

Questo è stato l'unico approccio che ho trovato in grado di sopprimere la convalida del keyup. Era eccessivo perché stavo facendo una chiamata ajax per convalidare l'input. Alla fine, ho impostato un attributo dati sull'elemento input che era controllato dal risultato ajax di un evento onchange per l'elemento input. Ciò ha permesso a jquery di convalidare un semplice ritorno vero o falso mentre faceva ancora una richiesta al server per la convalida del database. –

+1

Ci sono stati diversi eventi da sopprimere, ho fatto un semplice segnaposto per loro, 'var fnfalse = function() {return false; } ', e quindi usato per bloccare la funzionalità,' $ (elemento) .keyup (fnfalse) .blur (fnfalse) .focusout (fnfalse); '. –

5

Non sa come impostarlo ad un campo specifico, ma si potrebbe provare questo per disabilitare keyup convalida (per tutti i campi):

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

Vedi

+0

Sì, l'ho visto. Mi piace nella maggior parte dei campi, solo non i campi della carta di credito oi campi di convalida remoti (preferisco aspettare per colpire il sito una volta onblur invece di ogni cambiamento di un personaggio). Potrebbe essere solo una limitazione con cui devo convivere. Probabilmente farò il setDefaults globale come hai detto sopra ... – Sam

+0

... All'inizio lo stavo impostando usando per assicurarsi che il documento e gli script siano stati caricati ed erano pronti per l'uso, ma non ha funzionato. Ho dovuto estrarlo per farlo funzionare, ad esempio: . Tuttavia, mi chiedo cosa succederà se l'utente non ha ancora finito di scaricare gli script. Li ho messi in fondo al documento invece che nella testa. – Sam

+0

Finito per disattivare la "onkeyup" – Sam

0

È possibile impostare i valori predefiniti su off in onfocus evento del campo del credito, quindi trasformali in onblur. Sembra hacky, ma potrebbe funzionare.

20

$.validator.setDefaults non funziona per la convalida non invadente poiché il validatore è inizializzato internamente.

Per modificare le impostazioni su moduli che utilizzano la convalida discreto è possibile effettuare le seguenti operazioni:

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

Questo disabiliterebbe il trigger di convalida keyup per tutti gli elementi, no? Stava chiedendo come disabilitarlo per solo 1 elemento. – TweeZz

9

Mi rendo conto che questo è un vecchio post, ma nessuna delle risposte sembra di rispondere a questa domanda,

Come disabilitare onkeyup e abilitare onblur?

stavo cercando questo così ho pensato di condividere la risposta.

Come giustamente ha detto Ben Foster, onkeyup può essere disabilitato nel modo seguente

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

per abilitare la convalida onblur possiamo usare onfocusout

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

Quindi il nostro codice per disattivare onKeyUp e attivare onblur guardare come questo

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

Si potrebbe anche usare qualcosa come sopra,

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

Nel caso in cui si dispone di regole personalizzate poi,

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

This answer nel forum jQuery mi ha aiutato molto.

Problemi correlati