2012-02-12 14 views
13

Estoy tratando de agregar una validación discreta personalizada a mi aplicación. No parece ejecutar la validación.ASP .Net MVC 3: Validación no intrusiva personalizada

Aquí es mi clase Atributo:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context) 
{ 
    yield return new ModelClientValidationRule 
    { 
     ErrorMessage = ErrorMessage, 
     ValidationType = "custrequired" 
    }; 
} 

Y mi JavaScript:

$.validator.addMethod('custrequired', function(value, element, param) { 
    return value && value !== '99:99' && value !== '9:99'; 
}); 

$.validator.unobtrusive.adapters.add('custrequired', null, function(options) { 
    return options.messages['custrequired'] = options.message; 
}); 

Respuesta

31

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.

+0

Estaba agregando validadores en '$ (function() {...})' ... ¿puedo saber la razón por la que esto no funciona? – Moon

+0

@Moon - Editado con un intento de explicación. – JimmiTh

+2

En mi caso no funcionaba porque tenía el código dentro de '$ (document.ready()'. ¡Respuesta impresionante! Ayudó mucho ... –

3

Hay algunos problemas con la llamada $.validator.unobtrusive.adapters.add:

$.validator.unobtrusive.adapters.add('custrequired', function (options) { 
// -------------------------------------------------^ <-- removed "null" param 
    options.messages['custrequired'] = options.message; 
    // Register the rule properly 
    options.rules['custrequired'] = options.params; 
    // Don't return anything 
}); 

Después de esos dos cambios (y asegurarse de que ClientValidation y UnobtrusiveJavascript estuvieran habilitados en el archivo web.config), funciono bien

+0

Muchas gracias por la respuesta. Pero todavía no puedo hacer que funcione. – Moon

+0

@Moon ¿tiene algún error en la página? –

0

Tienes que cambiar el lado del servidor.

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context) 
    { 
     //I changed ErrorMessage for ErrorMessageString 
     yield return new ModelClientValidationRule 
     { 
     ErrorMessage = ErrorMessageString, 
     ValidationType = "custrequired" 
     }; 
    } 

Y también como Andre Whitaker dijo que hay que poner esto para añadir su validación en el lado cli.

//i changed param for params 
    $.validator.addMethod('custrequired', function(value, element, params) { 
     return value && value !== '99:99' && value !== '9:99'; 
    }); 

    //i specified that there isn't paramaters using an empty array. 
    $.validator.unobtrusive.adapters.add('custrequired', [] , function (options) { 
     options.messages['custrequired'] = options.message; 
     options.rules['custrequired'] = options.params; 
    }); 

RECUERDE COMPROBAR LA HTML de la entrada, debe tener el "Data-" atributo con su mensaje de error TEXTO

espero que funcione para usted.

Cuestiones relacionadas