ASP.NET MVC 3 validación del lado del cliente con parámetros


Siguiendo con este post Realice la validación del lado del cliente para el atributo personalizado

Estoy tratando de entender cómo hacer esto, pasando parámetros adicionales al script del lado del cliente

Según entiendo hasta ahora para implementar la validación personalizada con MVC 3, se requiere lo siguiente

Crear un atributo de validación personalizado

Basado en ValidationAttribute e implementando IClientValidatable. También he visto algunos ejemplos derivados de ModelValidator, que parece implementar la funcionalidad tanto de ValidationAttribute como de IClientValidatable. Así que este es mi primer punto de confusión en cuanto a lo que las diffirences son o si ModelValidator se utilizó en MVC 2 pero ahora está en desuso o qué ?

Se debe devolver una instancia de ModelClientValidationRule desde GetClientValidationRules() para especificar detalles como el mensaje de error, ValidationType (que entiendo que es el nombre de la función Javascript que realizará la validación del lado del cliente) y cualquier parámetro personalizado adicional que pueda tener el atributo y que deba pasarse a la validación de Javascript.

Asumo que el tiempo de ejecución (no estoy seguro de qué parte del mismo) usa el ModelClientValidationRule para generar el atributo html en los elementos de la etiqueta de la siguiente manera:

data-val="true"  (to indicate that the element requires validation)
data-val-[ValidationType]=[ErrorMessage]
data-val-[ValidationType].[ValidationParameters(n).Key]=[ValidationParameters(n).Value]

Implementar la lógica de validación del lado del cliente

Se debe crear una función Javascript y agregarla a jQuery.validadores con jQuery.validadores.addmethod() para que jQuery sea consciente de cuando necesita ser ejecutado. Algo como:

jQuery.validator.addMethod(
    'greaterThan', 
    function (value, element, params) {
        /.../
       return /* true or false   */ ; 
    },
    ''
); 

Mi pregunta aquí es si la firma 'function (value, element, params)' es estándar para los métodos que manejarán la validación y asumo que será llamada por alguna funcionalidad de jQuery en el momento apropiado, como antes de que se envíe un formulario o cuando un elemento pierda fuces o en eventos de keyUp. Simplemente no entiendo cómo puede controlar esto, es decir, elegir qué evento es apropiado para usted personalizado validación.

Implementar un adaptador discreto

Esto traduce atributos discretos a; algo que no tengo muy claro, pero asumo que es una Regla de jQuery, pero no tengo claro cómo funcionan. Algo así como

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    { },
    function (options) {
        options.rules['greaterThan'] = true;
        options.messages['greaterThan'] = options.message;
    }
); 

Mi pregunta aquí es sobre 'función (opciones)'. ¿Es esta la función que se llamará antes de ' function (value, element, params)' y es responsable de extraer las etiquetas discretas en una estructura de datos que puede ser entendida por jQuery.Validación. Del ejemplo de código me parece que options es un objeto que contiene ambos, los valores de atributo de la etiqueta (como options.mensaje) y las propiedades relevantes de jQuery a las que debe asignar (como opciones.mensajes['ClientSideValidationFunctionName']. Si es así, ¿cómo se recuperan y mapean los parámetros personalizados?

Espero no haber añadido ninguna confusión adicional.

Author: Community, 2011-01-24

1 answers

Podría utilizar el ValidationParameters propiedad para agregar parámetros personalizados a la regla:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    var rule = new ModelClientValidationRule
    {
        ErrorMessage = this.ErrorMessage,
        ValidationType = "futuredate",
    };
    rule.ValidationParameters.Add("param1", "value1");
    rule.ValidationParameters.Add("param2", "value2");
    yield return rule;
}

Que podría usarse en el adaptador:

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        var param1 = options.params.param1; // shall equal 'value1'
        var param2 = options.params.param2; // shall equal 'value2'
        // TODO: use those custom parameters to define the client rules
    }
);

ACTUALIZACIÓN:

Como se solicitó en la sección de comentarios, aquí está cómo podría pasar esos parámetros a la función de regla de validador personalizado:

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        // simply pass the options.params here
        options.rules['greaterThan'] = options.params;
        options.messages['greaterThan'] = options.message;
    }
);

jQuery.validator.addMethod('greaterThan', function (value, element, params) {
    // params here will equal { param1: 'value1', param2: 'value2' }
    return ...
}, '');
 64
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-24 17:44:19