jQuery - отлавливать обратный вызов валидации с сервера

Я пытаюсь перехватить обратный вызов ошибки плагина jquery validate. Я понимаю, что вы можете легко подключиться к этому, если бы я вызывал команду validate напрямую:

$('#form').validate({ 
    invalidHandler: function(form, validator) {
       var errors = validator.numberOfInvalids();
       if (errors) {
           //etc
       }
    }
});

Но я не. Вместо этого моя форма отправляется на сервер, и если !Model.IsValid затем сервер возвращает недопустимую модель и заполняет заполнитель сообщением об ошибке:

<span data-valmsg-replace="true" data-valmsg-for="Email" class="field-validation-error">This field is required</span>

Мне нужно знать, когда этот промежуток обновляется с сообщением об ошибке, потому что у меня есть следующая обертка для него:

<div class="errorContainer">
     @Html.ValidationMessageFor(m => m.Email)  /*This is the span above*/
</div>

куда div.errorContainer { visibility : hidden; } и мне нужно сделать его видимым только тогда, когда есть сообщение об ошибке (потому что оно имеет фон и не принадлежит, если нет ошибки внутри).

Как я могу это сделать? Оптимальным решением было бы то, где я могу ответить на ошибку из ОБА клиентской и серверной проверки, потому что я планирую встроить проверку на стороне клиента после того, как удостоверился, что сторона сервера покрыта. Я думаю, что лучший вопрос, то есть ли способ получить invalidHandler ответный огонь с сервера вернул ошибки?

1 ответ

Решение

Я просто подумал об этом и еще не проверял, но думаю, что это сработает. Отзовусь. Спасибо Барни, ваш комментарий дал мне лампочку.

$.ajax({
    url : '/Account/Login',
    dataType: $('#form').serialize(),
    beforeSend : function(xhr, opts){

        ... form validation ...

        if(formNotValid){
             xhr.abort(); /*Abort request*/
             /*Display client generated errors*/
        }

    },
    success: function(result){  // return from server is a JsonResult(new { success = true/false, viewResult = this.RenderPartialView("Login", model)})  

        if(result.success){
            //No errors
        }
        else{

            /*Display server generated errors*/

            $('#form').empty().html(result.viewResult);
            $('span.field-validation-error').each(function () {
                 $(this).parent().css({ "visibility": "visible" });
            });

            $('span.field-validation-valid').each(function () {
                 $(this).parent().css({ "visibility": "hidden" });
            });
        }


    }
});

ПРИМЕЧАНИЕ: this.RenderPartialView("Логин", модель) - это пользовательский метод расширения, найденный здесь.

Другие вопросы по тегам