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

A continuación de esta publicación Realice la validación del lado del cliente para el atributo personalizado

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

Como 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. Entonces, este es mi primer punto de confusión acerca de cuáles son las diferencias o si ModelValidator se usó en MVC 2 pero ahora está en desuso o qué?

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

Supongo que el tiempo de ejecución (no estoy seguro de qué parte de él) luego usa el ModelClientValidationRule para generar el atributo html en los elementos de 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 y agregar una función de Javascript a jQuery.validators con jQuery.validators.addmethod () para que JQuery lo sepa cuando sea necesario ejecutarlo. Algo como:

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

Mi pregunta aquí es si la función ‘signature (value, element, params)’ es estándar para los métodos que manejarán la validación y supongo que será invocada por alguna funcionalidad de jQuery en el momento apropiado, como antes de que se envíe un formulario o cuando elemento pierde Fuces o en KeyUp eventos. Simplemente no entiendo cómo puedes controlar esto, es decir, eliges qué evento es el apropiado para tu validación personalizada.

Implementar un adaptador discreto

Esto traduce atributos discretos a; algo que no soy muy claro, pero supongo que es una regla jQuery, pero no tengo claro cómo funcionan. Algo 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 invocará antes de ‘function (value, element, params)’ y es responsable de extraer las tags discretas en una estructura de datos que puede ser entendida por jQuery.Validation. Desde el ejemplo del código, me parece que las opciones son un objeto que contiene ambos, los valores de atributo de la etiqueta (como options.message) y las propiedades relevantes de jQuery a las que debe correlacionar (como options.messages [‘ClientSideValidationFunctionName’] . En caso afirmativo, ¿cómo se recuperan y asignan los parámetros personalizados?

Espero no haber agregado ninguna confusión adicional.

Puede usar la propiedad ValidationParameters para agregar parámetros personalizados a la regla:

 public IEnumerable 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 } ); 

ACTUALIZAR:

Tal como se solicitó en la sección de comentarios, aquí se explica cómo puede pasar esos parámetros a la función de regla de validación personalizada:

 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 ... }, '');