2012-03-14 20 views
16

Estoy usando MVC3 con una validación discreta. Tengo un campo que se espera que el usuario complete con algunos datos y luego presione el botón "buscar". Si nunca se presionó la búsqueda o si el usuario cambió el campo de entrada después de presionar buscar, no se podrá enviar el formulario.Validar un campo oculto

He agregado un campo oculto que se establece en true por el evento click() del botón y vaciado por el evento keyup() del cuadro de entrada. Ahora me gustaría agregar una regla de validación que requiera que el campo oculto sea true para permitir el envío.

Preferiblemente me gustaría usar una validación discreta, pero si eso no funciona, está bien con algo que requiera un javascript, siempre y cuando no arruine la validación discreta para el resto del formulario.

El siguiente fragmento de código hace exactamente lo que quiero, hasta que agregue type="hidden".

<input class="required" id="client-searched" data-val="true" 
    name="ClientSearched" data-val-required="Press search!"/> 
<span class="field-validation-valid" data-valmsg-replace="true" 
    data-valmsg-for="ClientSearched"/> 

Respuesta

26

tratar

var validator = $("#myFormId").data('validator');  
    validator.settings.ignore = ""; 

Aquí es un informativo blog post

EDITAR

@RAM sugirió una mejor solución favor FOLLOW

+2

Parece como que las cosas han cambiado desde esa publicación en el blog. En la publicación, explican cómo * deshabilitar * la validación de los campos ocultos. Con jquery.validate 1.9.0, el valor predeterminado es 'ignorar: ': oculto' '. –

+0

Apagará ignorando en absoluto, no lo considero como la solución correcta – tutok

+0

@tutok es una respuesta de un año por favor edite la pregunta para agregar su valiosa entrada ... saludos – Rafay

20

tuve un problema similar, y yo solía este código para cambiar los valores predeterminados, en MVC 4:

@Scripts.Render("~/bundles/jqueryval") 

<script type="text/javascript"> 
    $.validator.setDefaults({ 
     ignore: "" 
    }) 
</script> 

Fuente: JQuery validate

2

En algunos casos querrá simplemente ignorar la validación en una o varias campos ocultos (no todos de campo oculto) en client side y también que desea validar y otra campos ocultos en server side. En estos casos, tiene atributos de validación para todos los campos ocultos en su ViewModel y se usarán para validar el formulario cuando lo publique (server side).

Ahora necesita un truco para validar algunos de los campos ocultos en el lado del cliente (no en todos). En estos casos, te recomiendo que uses mi mecanismo.

Establecer data-force-val como true en las etiquetas de entrada ocultas de destino. Es nuestro atributo personalizado que utilizamos para detectar las entradas ocultas de destino que deseamos validar en el lado del cliente.

// This hidden input will validate both server side & client side 
<input type="hidden" value="" name="Id" id="Id" 
     data-val-required="The Id field is required." 
     data-val="true" 
     data-force-val="true"> 

// This hidden input will validate both server side & client side 
<input type="hidden" value="" name="Email" id="Email" 
     data-val-required="The Email field is required." 
     data-val="true" 
     data-force-val="true"> 

// This hidden input just will validate server side 
<input type="hidden" value="" name="Name" id="Name" 
     data-val-required="The Neme field is required." 
     data-val="true"> 

También puede establecer data_force-val para sus entradas ocultas por jQuery:

$("#Id").attr("data-force-val", true); // We want validate Id in client side 
$("#Email").attr("data-force-val", true); // We want validate Email in client side 
$("#Name").attr("data-force-val", false); // We wont validate Name in client side (This line is not necessary, event we can remove it) 

Ahora, la funcionalidad activa data-force-val="true" por algunos códigos simples como éstas:

var validator = $("#TheFormId").data('validator');  
validator.settings.ignore = ":hidden:not([data-force-val='true'])"; 

Nota: valor validator.settings.ignore por defecto es :hidden