Así que voy a profundizar un poco más sobre por qué esto no funciona porque soy el tipo de persona que no puede dormir por la noche sin saber jaja. Estoy usando jQuery validate 1.10 y Microsoft jQuery Nobtrusive Validation 2.0.20710.0 que se publicó el 29/01/2013.
Comencé buscando el método setDefaults en jQuery Validate y lo encontré en la línea 261 del archivo sin minificar. Todo lo que esta función realmente hace es fusionar su configuración json con la existente, $.validator.defaults
que se inicializa con la propiedad ignorar configurada en ": oculto" junto con los otros valores predeterminados definidos en jQuery Validate. Entonces, en este punto, hemos ignorado ignorar. Ahora veamos dónde se hace referencia a esta propiedad predeterminada.
Cuando rastreé el código para ver dónde $.validator.defaults
se hace referencia. Me di cuenta de que solo estaba siendo utilizado por el constructor para un validador de formularios, la línea 170 en jQuery validate unminmin file.
// constructor for validator
$.validator = function( options, form ) {
this.settings = $.extend( true, {}, $.validator.defaults, options );
this.currentForm = form;
this.init();
};
En este punto, un validador fusionará cualquier configuración predeterminada que se haya establecido y la adjuntará al validador de formularios. Cuando miras el código que está validando, resaltando, resaltando, etc., todos usan el objeto validator.settings para extraer la propiedad ignorar. Por lo tanto, debemos asegurarnos de que si establecemos el ignorar con el método setDefaults, debe ocurrir antes de que se invoque $ ("form"). Validate ().
Si está utilizando Asp.net MVC y el complemento discreto, se dará cuenta después de mirar el javascript que valida se llama en document.ready. También llamé a mi setDefaults en el bloque document.ready que se ejecutará después de los scripts, jquery validate y discreto porque he definido esos scripts en el html antes del que tiene la llamada. Entonces, mi llamada obviamente no tuvo impacto en la funcionalidad predeterminada de omitir elementos ocultos durante la validación. Hay un par de opciones aquí.
Opción 1 : podría, como Juan Mellado señaló, tener la llamada fuera del documento lista, que se ejecutará tan pronto como se haya cargado el script. No estoy seguro sobre el momento de esto ya que los navegadores ahora son capaces de cargar secuencias de comandos paralelas. Si solo soy demasiado cauteloso, corrígeme. Además, probablemente hay formas de evitar esto, pero para mis necesidades no seguí este camino.
Opción 2a : la apuesta segura en mis ojos es simplemente reemplazar el $.validator.setDefaults({ ignore: '' });
interior del evento document.ready con $("form").data("validator").settings.ignore = "";
. Esto modificará la propiedad de ignorar que realmente utiliza jQuery validate cuando realiza cada validación en sus elementos para el formulario dado.
Opciones 2b : después de examinar el código un poco más, también podría usarlo $("form").validate().settings.ignore = "";
como una forma de establecer la propiedad ignorar. La razón es que, al observar la función de validación, verifica si un objeto de validación ya se ha almacenado para el elemento de formulario a través de la $.data()
función. Si encuentra un objeto de validación almacenado con el elemento de formulario, simplemente devuelve el objeto de validación en lugar de crear otro.