2011-07-08 28 views
6

Descripción general:
En mi forma, tengo un campo que requiere validación remota. En la llamada remota, envío el valor del elemento de formulario así como los valores de un par de otros elementos de formulario de los que puede depender este elemento (utilizado en el servidor para validación).jquery validación remota - validar si los datos en el campo o no

La validación remota, cuando se llama, funciona muy bien. El problema es que la validación remota solo se llama cuando hay un valor en el elemento de formulario. Dependiendo de los parámetros enviados a la validación remota, este elemento de formulario puede ser necesario o puede haber otros problemas de validación.

¿Cómo puedo forzar la validación remota en este campo si tiene datos o no?

escenario específico:
tenga una lista papeles, y una entrada de texto de código vendedor.
Lógica del lado del servidor: (1) si se seleccionó el rol de vendedor, se requiere código de vendedor; (2) si la función de vendedor no está seleccionada, el código de vendedor debe estar vacío.

Tenga en cuenta que tengo otros valores de elementos de formulario que envía al servidor y no hay otra lógica del lado del servidor que no he incluido aquí por razones de brevedad, ya que no añaden valor a esta pregunta y sólo confundir las cosas.

<select name="roles" id="roles" multiple="multiple" size="5"></select> 
<input type="text" name="salespersoncode" id="salespersoncode" /> 

$("#add_user_form").validate({ 
    rules: { 
    salespersoncode: { 
     remote: { 
     type: "post", 
     url: "/AdminJson/CheckSalespersonCode", 
     dataType: "json", 
     data: { 
      salespersoncode: function() { return $("#salespersoncode").val(); }, 
      roles: function() { return $("#roles").val(); } 
     } 
     } 
    } 
    } 
} 

no quiero poner en la opción "necesaria" porque el campo de validación salespersoncode no es necesario en todas las situaciones.

Mi pregunta otra vez: ¿Cómo puedo forzar la validación remota en el campo de código de vendedor si tiene datos o no?

Gracias de antemano

Respuesta

1

Parece que no se puede tener un elemento de formulario que tiene la validación remota sin validación también haber requerido. Termina dando como resultado una discrepancia de dependencia.

La primera línea en el método remoto es la comprobación para ver si es opcional; si es opcional, devuelve una dependencia no coincidente. (opcional es el inverso del control remoto)

La solución que se me ocurrió fue usar una devolución de llamada de dependencia para la regla 'requerida'. En la función para la regla 'requerida', llame a una llamada ajax síncrona para probar los valores en la IU en el servidor y devolver verdadero/falso.

0

intente configurar explícitamente la primera salesPersonCode:

salespersoncode: { 
    salesPersonCode: ($("#salespersoncode").val().length > 0) ? $("#salespersoncode").val() : "", 
    remote: { 
     type: "post", 
     url: "/AdminJson/CheckSalespersonCode", 
     dataType: "json", 
     data: { 
      salespersoncode: salesPersonCode; }, 
      roles: function() { return $("#roles").val(); } 
     } 
    } 
} 
+0

Dentro de la función de validación(), no veo cómo puedo crear una variable local, como se recomienda. He actualizado mi pregunta para tener más detalles de validar el método. ¿Te importaría actualizar tu respuesta para decirme dónde puedo poner la var local sin que el navegador muestre errores js? –

+0

tal vez intente eso? –

4

Añadir este pedazo de código antes de llamar al método validate():

$.validator.methods._required = $.validator.methods.required; 
$.validator.methods.required = function(value, element, param) 
{ 
    if ($(element).is('[remote-validator]') && !$(element).hasClass('required')) 
     return true; 
return $.validator.methods._required.call(this, value, element, param); 
} 
+0

¡Un punto importante aquí es que el elemento debe tener un atributo con el nombre remote-validator !! (un atributo sin valor está bien). Si no desea agregar este atributo, y simplemente usa la validación remota _siempre que se especifique una regla remota, use esta condición 'typeof this.settings.rules [$ (element).attr ('nombre')]! = 'undefined' && typeof this.settings.rules [$ (elemento) .attr ('nombre')] .remote! = 'undefined'' en lugar de '$ (elemento) .is ('[remote-validator]') ' – TheStoryCoder

+0

¡Sin embargo, hay un punto crucial! Necesitará hacer que su llamada remota sea asincrónica estableciendo la propiedad/valor 'async: false' en su objeto' remote' en la configuración 'rules'. De lo contrario, tendrá un comportamiento inesperado ya que, por ejemplo. valid() no esperará la respuesta del servidor. – TheStoryCoder

Cuestiones relacionadas