Подтвердить что ты не робот

Как очистить ошибки проверки на стороне клиента MVC, когда нажата кнопка отмены, когда пользователь аннулировал форму?

У меня есть частичный вид, который отображается в основном представлении. В частичном представлении используются System.ComponentModel.DataAnnotations и Html.EnableClientValidation().

Щелкнута ссылка, а div, содержащий частичный вид, отображается в JQuery.Dialog().

Затем я нажимаю кнопку сохранения без ввода какого-либо текста в моем подтвержденном поле ввода. Это заставляет проверку на стороне клиента срабатывать, как ожидалось, и отображать сообщение "* required" рядом с недопустимым полем.

Когда нажата кнопка отмены, я хочу, чтобы reset подтверждение MVC на стороне клиента возвращалось к состоянию по умолчанию и удаляло любые сообщения, готовые к тому, когда пользователь снова открывает диалоговое окно. Есть ли рекомендуемый способ сделать это?

4b9b3361

Ответ 1

Этот ответ для MVC3. См. Комментарии ниже, чтобы помочь обновить его до MVC 4 и 5

Если вы просто хотите очистить сообщения проверки, чтобы они не показывались пользователю, вы можете сделать это с помощью javascript:

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');

    }

Если вам нужно reset работать только в вашем всплывающем окне, вы можете сделать это следующим образом:

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');

    }

Надеюсь, это тот эффект, который вы ищете.

Ответ 2

Если вы используете ненавязчивую проверку, которая поставляется с MVC, вы можете просто сделать:

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

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

Редактирование третьей стороны: Это в основном работало в моем случае, но мне пришлось удалить строку $(this).find(".field-validation-error").empty();. Это, похоже, повлияло на повторное отображение сообщений проверки при повторной отправке.

Я использовал следующее:

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

а затем вызывается следующим образом:

$('#MyFormId input').clearErrors();

Ответ 3

function resetValidation() {

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

} 

Ответ 4

Спасибо. У меня был аналогичный вопрос для немного другого сценария. У меня есть экран, где, когда вы нажимаете одну из кнопок отправки, он загружает файл. В MVC, когда вы возвращаете файл для загрузки, он не переключает экраны, поэтому любые сообщения об ошибках, которые уже присутствовали в сводке проверки, остаются там навсегда. Я, конечно, не хочу, чтобы сообщения об ошибках оставались там после того, как форма была отправлена ​​снова. Но я также не хочу очищать проверки на уровне поля, которые попадают на клиентскую сторону при нажатии кнопки отправки. Кроме того, некоторые из моих взглядов имеют более чем одну форму.

Я добавил следующий код (спасибо вам) в нижней части страницы Site.Master, чтобы он применился ко всем моим представлениям.

    <!-- 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>

Еще раз спасибо.

Ответ 5

Для этого вы можете использовать методы библиотеки проверки. Есть два объекта, представляющих интерес: FormContext и FieldContext. Вы можете получить доступ к FormContext с помощью свойства __MVC_FormValidation и одного FieldContext для каждого проверяемого свойства с помощью свойства FormContext fields.

Итак, чтобы очистить ошибки проверки, вы можете сделать что-то вроде этого 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();

Затем вы можете перехватить этот фрагмент кода в зависимости от того, какое событие вам нужно.

Источники для этого (совершенно недокументированного) понимания:

Ответ 6

Чтобы очистить артефакты проверки, включая сообщение, цветной фон поля ввода и цветную контур вокруг поля ввода, мне нужно было использовать следующий код, где это было (в моем случае) Bootstrap модальный диалог, содержащий вложенную форму.

$(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');
});

Ответ 7

Здесь вы можете просто удалить сообщение об ошибке

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

ИЛИ

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

введите описание изображения здесь