2012-07-06 47 views
9

Estoy secuestrando un formulario existente y POSTING en el servidor. jQuery validate hace la mayor parte de la validación, pero si la validación falla en el servidor, devolvemos los errores al cliente como JSON.Cómo borrar jquery validar errores

A continuación se muestra el código que hace que:

<script type="text/javascript"> 

    $(function() { 

     $("form").submit(function (e) { 
      var $form = $(this); 
      var validator = $form.data("validator"); 

      if (!validator || !$form.valid()) 
       return; 

      e.preventDefault(); 

      $.ajax({ 
       url: "@Url.Action("index")", 
       type: "POST", 
       data: $form.serialize(), 
       statusCode: { 
        400: function(xhr, status, err) {       
         var errors = $.parseJSON(err); 
         validator.showErrors(errors); 
        } 
       }, 
       success: function() { 
        // clear errors 
        // validator.resetForm(); 
        // just reload the page for now 
        location.reload(true); 
       } 
      }); 
     }); 

    }); 

</script> 

El problema es que parece que no puede borrar los errores de validación si el puesto es exitosa. Intenté llamar al validator.resetForm() pero esto no hace ninguna diferencia, los mensajes de error agregados por la llamada showError(), todavía se muestran.

Nota También estoy usando el complemento jQuery.validate.unobtrusive.

+0

puede usted por favor enviar el código completo? –

+0

tampoco hay mucho más, pero de todos modos publiqué el guión completo. –

+0

Solo me pregunto, ¿esta línea funciona para usted? validator.showErrors (errors); –

Respuesta

29

¿Has publicado esto hace un tiempo, no sé si has logrado resolverlo? Tuve el mismo problema con jQuery validate y con el plugin jQuery.validate.unobtrusive.

Después de examinar el código fuente y algunas depuraciones, llegué a la conclusión de que el problema proviene de la forma en que el complemento discreto maneja los mensajes de error. Elimina el errorClass que establece el complemento jQuery.validate, por lo que cuando se restablece el formulario, jQuery validate no puede encontrar las etiquetas de error para eliminar.

que no quería que modificar el código de los plugins, así que fue capaz de superar esto de la siguiente manera:

// get the form inside we are working - change selector to your form as needed 
var $form = $("form"); 

// get validator object 
var $validator = $form.validate(); 

// get errors that were created using jQuery.validate.unobtrusive 
var $errors = $form.find(".field-validation-error span"); 

// trick unobtrusive to think the elements were succesfully validated 
// this removes the validation messages 
$errors.each(function(){ $validator.settings.success($(this)); }) 

// clear errors from validation 
$validator.resetForm(); 

nota: Yo uso el prefijo $ para las variables para denotar las variables que contienen jQuery objetos.

+1

Sus requisitos eran probablemente ligeramente diferentes, pero lo adapté para simplemente ser '$ ('# someFormId'). Validate(). ResetForm();' – AaronLS

+0

@AaronLS. jquery.validade.unobtrusive o no, tuve el mismo problema y su código lo resolvió. Limpio y simple, gracias. – BernardA

+0

Tuve el mismo problema y tu solución funcionó bien, ¡tks! –

0

puede ser que me equivoque para borrar los errores de esta manera:

function clearError(form) { 
    $(form + ' .validation-summary-errors').each(function() { 
     $(this).html("<ul><li style='display:none'></li></ul>"); 
    }) 
    $(form + ' .validation-summary-errors').addClass('validation-summary-valid'); 
    $(form + ' .validation-summary-errors').removeClass('validation-summary-errors'); 
    $(form).removeData("validator"); 
    $(form).removeData("unobtrusiveValidation"); 
    $.validator.unobtrusive.parse($(form)); 
}; 

me trataron respuesta dada en el comentario de AaronLS pero no tiene la solución, así que sólo lo haga así.

Quizás útil a alguien.

1

$ ("# forma"). Find ('lapso de campo de validación de errores '). Html ('')

0

Aquí está el código que terminé usando para borrar/restablecer todos los errores. Es posible que haya algo de redundancia allí, pero está funcionando para mí.

function removeValidationErrors(frmId) { 
 
    var myform = $('#' + frmId); 
 
    myform.get(0).reset(); 
 
    var myValidator = myform.validate(); 
 
    $(myform).removeData('validator'); 
 
    $(myform).removeData('unobtrusiveValidation'); 
 
    $.validator.unobtrusive.parse(myform); 
 
    myValidator.resetForm(); 
 
    $('#' + frmId + ' input, select').removeClass('input-validation-error'); 
 
}

Cuestiones relacionadas