Hay un montón de cosas que pueden salir mal aquí, no implica el código que has enviado:
¿Cómo funciona el código HTML generado para el aspecto <input>
? ¿Incluye el atributo data-val-custrequired
?
Si no, ¿se acordó de agregar la interfaz en la declaración de clase - IClientValidatable
?
¿Se acordó de no añadir su validador personalizado dentro de un manejador de DOM ready
? (es decir, no use $(document).ready()
o $(function() { ... })
) - la validación debe configurarse antes de que el documento esté listo.
ETA: La razón de este último es que jquery.validate.unobtrusive
hace esto:
$(function() {
$jQval.unobtrusive.parse(document);
});
es decir, se analiza el documento para los atributos de validación, etc. reglas en el documento listo. Dado que la secuencia de comandos debe cargarse para registrar sus adaptadores, su script de registro normalmente debería venir después dejquery.validate.unobtrusive.js
. Pero eso también hace que cualquier manejador .ready
que registre se llame después de, el "no intrusivo", por lo que es demasiado tarde. Supongo que podrías poner tu script de registro antes y luego usar .ready
. Nunca lo intenté, y nunca lo había visto hecho.
También, en este caso, esto debería ser suficiente para registrar el adaptador:
$.validator.addMethod('custrequired', function(value, element, param) {
return value && value !== '99:99' && value !== '9:99';
});
jQuery.validator.unobtrusive.adapters.addBool('custrequired');
seguirá añadir cualquier mensaje de error personalizado que pueda tener, pero desde el validador no está usando parámetros adicionales (como eg StringLength
pasa MaximumLength
etc.), no hay necesidad de un adaptador personalizado.
Estaba agregando validadores en '$ (function() {...})' ... ¿puedo saber la razón por la que esto no funciona? – Moon
@Moon - Editado con un intento de explicación. – JimmiTh
En mi caso no funcionaba porque tenía el código dentro de '$ (document.ready()'. ¡Respuesta impresionante! Ayudó mucho ... –