2011-08-04 29 views
10

Recientemente tuve una pregunta en getting checkbox validation working en el lado del cliente dentro de un proyecto de MVC. Esta pregunta fue respondida con éxito, pero planteó otra consulta.MVC Añadiendo métodos en jquery.validate.unobtrusive.js

Para que mi casilla de validación para trabajar que tenía que añadir los siguientes bits de JavaScript directamente en jquery.validate.unobtrusive.js:

$jQval.addMethod("mustbetrue", function (value, element, param) { 
    // check if dependency is met 
    if (!this.depend(param, element)) 
     return "dependency-mismatch"; 
    return element.checked; 
}); 

adapters.add("mustbetrue", function (options) { 
    setValidationValues(options, "mustbetrue", true); 
}); 

Esto funcionó muy bien, pero estoy contento de tener que cambie este archivo en caso de que Microsoft o el complemento de validación chicos actualicen el archivo en el futuro. Si aún no estoy trabajando en el proyecto, este archivo puede sobrescribirse sin que las personas se den cuenta de que se ha personalizado.

Así que con eso en mente He intentado añadir esto en un archivo JavaScript externo:

$.validator.addMethod("mustbetrue", function (value, element, param) { 
    // check if dependency is met 
    if (!this.depend(param, element)) 
     return "dependency-mismatch"; 
    return element.checked; 
}); 

$.validator.unobtrusive.adapters.add("mustbetrue", function (options) { 
    setValidationValues(options, "mustbetrue", true); 
}); 

Lamentablemente ahora el script del lado del cliente en mis casillas de verificación no funciona. ¿Alguien puede ver lo que estoy haciendo mal?

Gracias de antemano

S

Respuesta

9

Sniffer,

Cuanto más miro esto, más Niego con la cabeza (de mi).

Tras un examen más, el método de Darin va a funcionar, siempre y cuando se agrega una línea a su página de guión:

<script type="text/javascript"> 
    $.validator.unobtrusive.adapters.addBool("mustbetrue", "required"); 
    $.validator.unobtrusive.parse(); 
</script> 

Siempre que se realice un cambio (por ejemplo, agregar un nuevo adaptador), debe re-análisis sintáctico los atributos de validación discretos. Como la última acción en jquery.validate.unobtrusive.js es el análisis sintáctico de los atributos, y el adaptador se agrega después del análisis, el nuevo análisis resuelve este problema.

counsellorben

P.S. Esto resuelve su problema, pero aún no resuelve el problema de cómo agregar otros validadores personalizados que no usan métodos integrados desde jquery.validate.js sin modificar jquery.validate.unobtrusive.js.

P.P.S. Encontré la respuesta para agregar métodos de validación personalizados. Para agregar mmethods de validación personalizados sin modificar jquery.validate.unobtrusive.js, debe "tomar prestado" algo de su código para agregarlo a su script de página. La adición de un método personalizado a continuación, tiene el siguiente aspecto:

<script type="text/javascript"> 
    var $jQval = $.validator, 
     adapters, 
     data_validation = "unobtrusiveValidation"; 

    function setValidationValues(options, ruleName, value) { 
     options.rules[ruleName] = value; 
     if (options.message) { 
      options.messages[ruleName] = options.message; 
     } 
    } 

    $jQval.addMethod("mustbetrue", function (value, element, param) { 
     // check if dependency is met 
     if (!this.depend(param, element)) 
      return "dependency-mismatch"; 
     return element.checked; 
    }); 

    $.validator.unobtrusive.adapters.add("mustbetrue", function (options) { 
     setValidationValues(options, "mustbetrue", true); 
    }); 

    $jQval.unobtrusive.parse(); 
</script> 
+0

Gracias por esto de nuevo! Es "extraño", aunque entiendo exactamente lo que estás diciendo y entiendo que debería funcionar, tan pronto como tomo 'addMethod' y 'add' de jquery.validate.unobtrusive.js y coloco cualquiera de las combinaciones anteriores en otra ¡archivo js deja de funcionar! Incluso he puesto consol.log en el método ath addBool dentro del archivo jquery.validate.unobtrusive.js para comprobar que "mustbetrue" se está registrando y lo está. ¡Como dije raro! – Sniffer

+0

Creo que es muy importante decir que necesita esto en su marcado para que la solución anterior funcione:

+0

Puede simplificar la adición de su adaptador discreto: $ .validator .unobtrusive.adapters.addBool ("mustbetrue"); Tampoco debería necesitar llamar al análisis siempre que agregue el nuevo método de validación y el adaptador fuera de un documento listo. –

0

no tengo ningún problema de añadir este código a un archivo JavaScript externo, que i Robada de This site

// Custom validator for checkboxs 
jQuery.validator.unobtrusive.adapters.add("brequired", function (options) {  
    //bool-required for checkboxes  
    if (options.element.tagName.toUpperCase() == "INPUT" && 
     options.element.type.toUpperCase() == "CHECKBOX") 
    { 
     options.rules["required"] = true;   
     if (options.message) { 
      options.messages["required"] = options.message; 
     } 
    } 
}); 

¿Estás seguro de que usted pone su escritura DESPUÉS de los scripts jquery en tu página? El mío es el último en la lista.

+0

Lo hice y no está funcionando. – Rookian

3

Validación discreta no me está dando más que dolor.

En una página muy sencilla prueba, esto funciona:

$(document).ready(function() { 
    jQuery.validator.unobtrusive.adapters.add(
     'mustbetrue', ['properties'], function (options) { 
      options.rules['mustbetrue'] = options.params; 
      options.messages['mustbetrue'] = options.message; 
     } 
     ); 

    jQuery.validator.addMethod('mustbetrue', function (value, element, params) { 
     // check if dependency is met 
     if (!this.depend(param, element)) { 
      return "dependency-mismatch"; 
     } 

     switch (element.type) { 
      case "checkbox": 
       return element.checked; 
       break; 
      case "hidden": 
       return (value == 'true' || value == 'True'); 
       break; 
      default: 
       alert('type = ' + element.type); 
       return true; 
       break; 
     } 
    }); 
}); 

Sin embargo, cuando muevo el código a mi forma más compleja, de repente deja de funcionar y no tengo ni idea de por qué y no hay tiempo para ahondar en el código discreto para probar y descubrir.

La solución de counsellorben funciona en mi forma más compleja.

Si alguien puede dirigirme a un sitio que explica en detalle cómo agregar correctamente un validador personalizado a una validación discreta, siempre seré agradecido. Cada sitio que visito tiene una solución diferente.

+3

Este código NO debe estar en una función de documento listo. La validación discreta se ejecuta en el documento listo, y se espera que todas las reglas agregadas se agreguen para entonces. –

+0

@ErikW Sí, estuve luchando con esto por alrededor de una hora, y ahora puedo confirmar ** este código NO debería estar en la función de documento listo ** - simplemente no funcionará. –