2011-11-05 26 views
24

¿Hay alguna manera de desactivar la validación de jQuery para un determinado validador (tarjeta de crédito) para que solo se produzca onblur, en lugar de onkeyup?ASP.net MVC 3 jQuery Validación; ¿Deshabilitar discretamente OnKeyUp?

Sobre la base de la documentación de jQuery Validador pensé que podía hacer algo como esto:

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

Sin embargo, no parece estar funcionando.

También probé haciendo lo siguiente en mi validador:

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

No funciona bien, pero yo estaba tomando una puñalada en el uso adecuado de ValidationParameters.

Es un poco molesto ingresar un número de tarjeta de crédito en un formulario y hacer que cambie aleatoriamente de inválido a válido, y luego de nuevo a no válido.

¿Alguna idea? ¡Gracias!

Respuesta

17

Ok chicos,

yo estaba en el mismo problema y encontrado este hilo: http://old.nabble.com/-validate--onkeyup-for-single-field-td21729097s27240.html

La idea es, básicamente, para sobrescribir el evento keyup y volver falsa. Así, en su caso específico que tendrá que añadir:

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

Y verá que su campo de tarjeta de crédito sólo se comprueba el desenfoque o envíe (pero el resto está trabajando en keyup también).

Estaba buscando la misma solución, y encontré que la respuesta aquí podría mejorarse, así que pensé que sería bueno compartirla aquí.

+2

Fantástico consejo para desactivar la clave devolviendo false. – Sam

+0

Este fue el único enfoque que encontré que fue capaz de suprimir la validación de teclado. Fue excesivo ya que estaba haciendo una llamada a Ajax para validar la entrada. Al final, establecí un atributo de datos en el elemento de entrada que estaba controlado por el resultado ajax de un evento onchange para el elemento de entrada. Esto permitió a jquery validar tener un retorno simple verdadero o falso al tiempo que realizaba una solicitud al servidor para la validación de la base de datos. –

+1

Hubo varios eventos para suprimir, hice un marcador de posición simple para ellos, 'var fnfalse = function() {return false; } ', y luego lo usó para bloquear la funcionalidad,' $ (elemento) .keyup (fnfalse) .blur (fnfalse) .focusout (fnfalse); '. –

5

No sabe cómo configurarlo a un campo específico, pero usted podría intentar esto para desactivar la validación keyup (para todos los campos):

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

Ver

+0

Sí, lo vi. Me gusta en la mayoría de los campos, simplemente no en los campos de tarjetas de crédito ni en los campos de validación remotos (prefiero esperar para acceder al sitio una vez en línea en lugar de cada cambio de personaje). Puede ser una limitación con la que tengo que vivir. Probablemente haga los setDefaults globales como usted mencionó anteriormente ... – Sam

+0

... Al principio estaba configurando esto usando para asegurarse de que el documento y las secuencias de comandos se habían cargado y estaban listos para usar, pero no funcionó. Tuve que sacarlo para que funcione, por ejemplo: . Sin embargo, me pregunto qué pasará si el usuario no ha terminado de descargar los guiones aún. Los puse en la parte inferior del documento en lugar de en la cabeza. – Sam

+0

Acaba de deshabilitar el "onkeyup" – Sam

0

Puede establecer los valores predeterminados en off en el foco evento del campo de crédito, luego gírelos en el onblur. Parece hacky, pero podría funcionar.

20

$.validator.setDefaults no funciona para una validación no intrusiva ya que el validador se inicializa internamente.

Para cambiar la configuración de las formas que utilizan la validación discreta que puede hacer lo siguiente:

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

Esto inhabilitaría el activador de validación de teclado para todos los elementos, ¿no? Él estaba preguntando cómo desactivarlo solo por 1 elemento. – TweeZz

9

me di cuenta que es una entrada antigua, pero ninguna de las respuestas parecen responder a esta pregunta,

Cómo deshabilitar onkeyup y habilitar onblur?

Estaba buscando esto, así que pensé que iba a compartir la respuesta.

Como se ha dicho con razón, Ben Foster, onkeyup se puede desactivar de la siguiente manera

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

Para habilitar la validación onBlur podemos utilizar onfocusout

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

Así que nuestro código para desactivar onkeyup y permitir onBlur mirar como este

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

También podría usar algo como lo de arriba,

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

En caso de que tenga reglas personalizadas luego,

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

This answer en el foro jQuery me ayudó mucho.

Cuestiones relacionadas