2010-05-09 10 views
27

Tengo una vista parcial que se representa dentro de una vista principal. La vista parcial aprovecha System.ComponentModel.DataAnnotations y Html.EnableClientValidation().¿Cómo borro los errores de validación MVC del lado del cliente cuando se hace clic en un botón de cancelar cuando un usuario ha invalidado un formulario?

Se hace clic en un enlace y se muestra div que contiene la vista parcial dentro de un JQuery.Dialog().

Luego hago clic en el botón Guardar sin ingresar ningún texto en mi campo de entrada validado. Esto provoca que la validación del lado del cliente se active como se esperaba y muestre el mensaje "* required" junto al campo no válido.

Cuando se hace clic en el botón cancelar, quiero restablecer la validación MVC del lado del cliente a su estado predeterminado y eliminar cualquier mensaje, listo para cuando el usuario vuelva a abrir el cuadro de diálogo. ¿Hay una manera recomendada de hacer esto?

+0

Al hacer clic en el botón Cancelar debe cerrar el diálogo jQuery, lo que requeriría que para construir uno nuevo cuando el usuario hace clic en el botón Editar. En ese momento, la validación de MVC ya debería estar en su estado predeterminado. Si no lo está (es decir, los objetos DOM subyacentes asociados con el diálogo aún contienen datos de la última llamada de Diálogo), la forma correcta es simplemente borrar los valores de los objetos DOM. –

Respuesta

38

Esta respuesta es para MVC3. Véanse los comentarios a continuación para obtener ayuda para actualizar a MVC 4 y 5

Si lo que desea es borrar los validación-mensajes para que no se muestran al usuario lo puede hacer con javascript de esta manera:

function resetValidation() { 
     //Removes validation from input-fields 
     $('.input-validation-error').addClass('input-validation-valid'); 
     $('.input-validation-error').removeClass('input-validation-error'); 
     //Removes validation message after input-fields 
     $('.field-validation-error').addClass('field-validation-valid'); 
     $('.field-validation-error').removeClass('field-validation-error'); 
     //Removes validation summary 
     $('.validation-summary-errors').addClass('validation-summary-valid'); 
     $('.validation-summary-errors').removeClass('validation-summary-errors'); 

    } 

Si necesita el reinicio para trabajar solamente en su emergente puede hacerlo de esta manera:

function resetValidation() { 
     //Removes validation from input-fields 
     $('#POPUPID .input-validation-error').addClass('input-validation-valid'); 
     $('#POPUPID .input-validation-error').removeClass('input-validation-error'); 
     //Removes validation message after input-fields 
     $('#POPUPID .field-validation-error').addClass('field-validation-valid'); 
     $('#POPUPID .field-validation-error').removeClass('field-validation-error'); 
     //Removes validation summary 
     $('#POPUPID .validation-summary-errors').addClass('validation-summary-valid'); 
     $('#POPUPID .validation-summary-errors').removeClass('validation-summary-errors'); 

    } 

espero que esto es el efecto que buscas.

+0

Gracias por su respuesta. Había implementado una solución similar, pero expone un problema adicional, que cuando se hace clic en el botón de cancelar, el cuadro de texto pierde el foco y ¡se vuelve a activar la validación! Al final, ve que aparece el mensaje de error antes de que se cierre el cuadro de diálogo. La única forma en que puedo terminar resolviendo este problema es inyectando el diálogo en el div usando una llamada JQuery.Ajax para obtener la vista parcial en el DIV utilizado por el menú emergente. De esta forma, cuando el diálogo está cerrado, la 'persistencia' se pierde. –

+0

¿No pudo eliminar el foco del cuadro de texto antes de llamar a la función "reiniciar"? ¿O me estoy perdiendo algo en su configuración? – Falle1234

+1

Utilicé este método en una aplicación MVC 4, pero dejó los errores de validación en la pantalla. Al agregar '$ ('. Validation-summary-errors li'). Remove();' al principio del método se corrigió ese problema. – AaronSieb

1

Gracias. Tenía una pregunta similar para un escenario ligeramente diferente. Tengo una pantalla donde cuando haces clic en uno de los botones de enviar, descarga un archivo. En MVC cuando devuelve un archivo para su descarga, no cambia de pantalla, por lo que los mensajes de error que ya estaban allí en el resumen de validación permanecen allí para siempre. Ciertamente no quiero que los mensajes de error permanezcan allí después de que el formulario se haya enviado nuevamente. Pero tampoco quiero borrar las validaciones a nivel de campo que se captan en el lado del cliente cuando se hace clic en el botón Enviar. Además, algunos de mis puntos de vista tienen más de una forma en ellos.

Agregué el siguiente código (gracias a usted) en la parte inferior de la página Site.Master, por lo que se aplica a todas mis vistas.

<!-- This script removes just the summary errors when a submit button is pressed 
    for any form whose id begins with 'form' --> 
<script type="text/javascript"> 
    $('[id^=form]').submit(function resetValidation() { 
     //Removes validation summary 
     $('.validation-summary-errors').addClass('validation-summary-valid'); 
     $('.validation-summary-errors').removeClass('validation-summary-errors'); 
    }); 
</script> 

Gracias de nuevo.

+0

Ahora es un año más tarde y actualicé el proyecto a VS 2010 , MVC3 y Razor.Por algún motivo, MVC3 ya no coloca la etiqueta "id = 'form0'" cuando se usa la función auxiliar HTML.BeginForm() de manera predeterminada. Tendría que hacer una nueva {id = 'form0 "} en cada Html.BeginForm(). O bien, debe establecer ClientValidationEnabled en true y establecer UnobtrusiveJavaScriptEnabled en false. Lo que terminé haciendo es modificar el selector jQuery para que funcione. cualquier etiqueta de formulario como sigue "$ ('formulario'). submit (función resetValidation() {" –

1

Puede acceder a los métodos de la biblioteca de validación para hacerlo. Hay dos objetos de interés: FormContext y FieldContext. Puede acceder al FormContext a través de la propiedad __MVC_FormValidation del formulario y una FieldContext por cada propiedad validada a través de la propiedad FormContextfields.

Así, para borrar los errores de validación, se puede hacer algo como esto a un form:

var fieldContexts = form.__MVC_FormValidation.fields; 
for(i = 0; i < fieldContexts.length; i++) { 
    var fieldContext = fieldContexts[i]; 
    // Clears validation message 
    fieldContext.clearErrors(); 
} 
// Clears validation summary 
form.__MVC_FormValidation.clearErrors(); 

A continuación, se puede conectar ese pedazo de código para que sea caso de que necesite.

Fuentes para esta idea (bastante indocumentado):

16

Si está utilizando una validación discreta que viene con MVC, simplemente puede hacer:

$.fn.clearErrors = function() { 
    $(this).each(function() { 
     $(this).find(".field-validation-error").empty(); 
     $(this).trigger('reset.unobtrusiveValidation'); 
    }); 
}; 

--------------------------------------------- ---------------------------

Terceros Editar: Esto sobre todo trabajado en mi caso, pero tenía que eliminar la línea $(this).find(".field-validation-error").empty();. Esto pareció afectar la nueva presentación de los mensajes de validación al volver a enviar.

que utilizó la siguiente:

$.fn.clearErrors = function() { 
     $(this).each(function() { 
      $(this).trigger('reset.unobtrusiveValidation'); 
     }); 
    }; 

y luego se llama así:

$('#MyFormId input').clearErrors(); 
2
function resetValidation() { 

    $('.field-validation-error').html(""); 

} 
0

Con el fin de completar clara los artefactos de validación, incluyendo el mensaje, el color de fondo de la campo de entrada, y el contorno de color alrededor del campo de entrada, necesitaba usar el siguiente código, donde este era (en mi caso) un cuadro de diálogo modal de Bootstrap que contenía una forma incrustada.

$(this).each(function() { 
    $(this).find(".field-validation-error").empty(); 
    $(this).find(".input-validation-error").removeClass("input-validation-error"); 
    $(this).find(".state-error").removeClass("state-error"); 
    $(this).find(".state-success").removeClass("state-success"); 
    $(this).trigger('reset.unobtrusiveValidation'); 
}); 
0

Aquí puede utilizar simplemente eliminar el mensaje de error

$('.field-validation-valid span').html('') 

O

$('.field-validation-valid span').text('') 

enter image description here

Cuestiones relacionadas