2011-10-06 13 views
6

Aquí está el caso de uso:MVC3 validación no intrusiva: cómo eliminar/volver a adjuntar la validación de un grupo de elementos?

Tengo este formulario largo con grupo de campo que solo se vuelve visible si el usuario hace una selección determinada en una de las entradas visibles. Al leer la publicación de Brad Wilson sobre el tema, pensé en jQuery.validator.unobtrusive.parse ('.extra-data') donde .extra-data es una clase de div oculta. No hubo suerte ya que los datos ya estaban allí cuando se realizó el primer análisis.

Así que al final se me ocurrió esto para eliminar las reglas:

$('.data-panel').find('input[type="text"], textarea, select').each(function (i, item) { 
    var currentRules = $(item).rules('remove'); // Saving removed rules to a sorta dictionary 
    if (!$.isEmptyObject(currentRules)) { 
     removedRules[$(item).attr("name")] = currentRules; 
    } 
}); 

y esto para volver a montar ellos:

$('.data-panel').find('input[type="text"], textarea, select').each(function (i, item) { 
    if (!$.isEmptyObject(removedRules[$(item).attr('name')])) { 
     $(item).rules('add', removedRules[$(item).attr('name')]); 
    } 
}); 

El problema es que se siente un poco hacky que a mí m recorriendo literalmente cada campo eliminando y volviendo a unir esas reglas de validación. Mi pregunta es: ¿no hay una manera más directa? El rendimiento también es un problema, en una de esas enormes formas puede sentir la demora entre el clic y la ejecución de validación.

+0

http://stackoverflow.com/questions/5104288/adding-validation-with-mvc-3-jquery-validator-in-execution-time –

Respuesta

23

No elimine ni vuelva a adjuntar las reglas. Solo disable o enable entradas. Los campos deshabilitados no participan en la validación, ni tampoco se envían al servidor.

//disable inputs. No validation will occur on these 
$('.data-panel').find('input[type="text"], textarea, select').attr('disabled', 'disabled'); 

//enable inputs. Validation is re-enabled 
$('.data-panel').find('input[type="text"], textarea, select').removeAttr('disabled'); 
+0

Definitivamente me gusta que la solución mucho más que la mía, gracias hombre . – JoseMarmolejos

Cuestiones relacionadas