Отключить обязательную проверку с помощью JavaScript - PullRequest
9 голосов
/ 12 сентября 2011

У меня есть форма для создания объекта. У модели создания есть некоторые свойства, которые видны (.hide, .show ()), только если установлен флажок и помечены как обязательные (по атрибуту в модели).

К сожалению, когда флажок не установлен, необходимая проверка выполняется для скрытых свойств.

Как отключить обязательную проверку для этих свойств?

Я попытался установить для свойства data-val элемента input значение false, но это не работает.

Есть идеи?

Заранее спасибо Tobias

UPDATE:

Вот код Java-скрипта. Свойство data-val правильно установлено в false. кажется, что проверка не заботится об этом свойстве. есть также атрибут data-val-required, но есть текст, который я не могу сохранить.

$(function () {
                $("#MyCheckbox")
                    .change(function () {
                        if (this.checked) {
                            $("#divWithChildProperties [data-val]").attr("data-val", true);
                            $("#divWithChildProperties ").show();
                        }
                        else {
                            $("#divWithChildProperties [data-val]").attr("data-val", false);
                            $("#divWithChildProperties ").hide();
                        }
                    })
            });

Ответы [ 7 ]

22 голосов
/ 12 сентября 2011

Я обработал подобные случаи с помощью пользовательского атрибута проверки. Вместо использования атрибута Required для свойств вы можете создать атрибут RequiredIf и сделать некоторые из ваших свойств обязательными, только если другое свойство имеет определенное значение.

Вот пост о создании такого атрибута (пример в середине страницы в разделе «Более сложный пользовательский валидатор»): http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2

Если ваш флажок представляет свойство в вашей модели, это должно работать нормально.

Если вы не хотите обрабатывать это с помощью нового атрибута проверки, вам придется сделать еще несколько вещей, а не просто изменить атрибут data-val на false. Когда jQuery validate сначала анализирует вашу форму, он сохраняет значения в данных формы. Так что простого изменения data-val недостаточно. Вам также необходимо удалить сохраненные данные проверки и повторно обработать форму. Вот пример:

// Do this after you've removed/modified the data-val attribute
$('selector for your form').removeData('unobtrusiveValidation');
$('selector for your form').removeData('validator');
$.validator.unobtrusive.parse('selector for your form');
6 голосов
/ 27 августа 2015

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

$('#ElementId').rules('remove');

Точно так же, как вы можете использовать имя класса как,

$('.ElementClassName').rules('remove');

Если вы хотите удалить конкретное правило , сделайте так

$('#ElementId').rules('remove', 'required');
1 голос
/ 12 сентября 2011

Ненавязчивый плагин javascript, предоставляемый MVC, не обрабатывает свойства данных на лету. Вместо этого он анализирует результаты в готовом документе и кэширует их.

Попробуйте позвонить $.validator.unobtrusive.parse(myForm) в своей форме после изменения соответствующего свойства, чтобы увидеть, дает ли оно ожидаемые результаты.

0 голосов
/ 11 ноября 2014

Есть много способов отключить ненавязчивую проверку в Javascript, но большинство из них кажется немного хакерскими ...

  1. Недавно обнаружилось, что вы можете сделать это с помощью кнопки отправки.Проверьте эту ссылку для получения информации

http://www.nitrix -reloaded.com / 2013/09/16 / disable-client-side-validation-on-a-button-click-asp-net-mvc /

//this
<script type="text/javascript">
  document.getElementById("backButton").disableValidation = true;
</script>
//or this
<input type="submit" name="backButton" value="Back" 
 title="Go back to Prev Step" disableValidation="true" />
//or this
<input type="submit" name="backButton" value="Back"
 title="Go back to Prev Step" class="mybtn-style cancel" />
Другой способ, более гибкий, но более сложный: вы можете отключить ненавязчивую проверку, установив для атрибута data-val значение false.Но есть хитрость ...

Ненавязчивые данные проверки кэшируются, когда документ готов.Это означает, что если у вас есть data-val='true' в начале и вы измените его позже, оно все равно будет true.

Итак, если вы хотите изменить его после того, как документ будет готов, вы такженеобходимо сбросить валидатор, который удалит кэшированные данные.Вот как это сделать:

disableValidation: function () {
    //Set the attribute to false
    $("[data-val='true']").attr('data-val', 'false');

    //Reset validation message
    $('.field-validation-error')
    .removeClass('field-validation-error')
    .addClass('field-validation-valid');

    //Reset input, select and textarea style
    $('.input-validation-error')
    .removeClass('input-validation-error')
    .addClass('valid');

    //Reset validation summary
    $(".validation-summary-errors")
    .removeClass("validation-summary-errors")
    .addClass("validation-summary-valid");

    //To reenable lazy validation (no validation until you submit the form)
    $('form').removeData('unobtrusiveValidation');
    $('form').removeData('validator');
    $.validator.unobtrusive.parse($('form'));
},

Вам не нужно сбрасывать все сообщения, стили ввода и сводку проверки, чтобы иметь возможность отправить форму, но это полезно, если вы хотите изменить проверку послестраница загружена.В противном случае, даже если вы измените проверку, предыдущие сообщения об ошибках все равно будут видны ...

0 голосов
/ 13 сентября 2011

Вы можете внедрить пользовательский валидатор, такой как «RequiredIf».

Это сохранит дизайн вашей модели достаточно очевидным (в отличие от предлагаемых решений только на стороне клиента).Это позволяет вам сохранить логику проверки отдельно от логики отображения (вот что такое MVC).

См. Этот ответ: RequiredIf Атрибут условной проверки

и, в конечном счете,сообщение в блоге: Условная проверка в ASP.NET MVC 3

ура!

0 голосов
/ 12 сентября 2011

По умолчанию DataAnnotationsModelValidatorProvider добавляет атрибут Обязательный для всех типов значений. Вы можете изменить это поведение, добавив код в этот ответ .

0 голосов
/ 12 сентября 2011

Ненавязчивая проверка ищет этот атрибут data-val="true"

Я предполагаю, что если вы сделаете $('#mycheckbox').data('val','false'), проверка пропустит элемент с этим идентификатором.

Возможно, существуетболее подходящий способ сделать это, но если нет, возьмите это.

ура.

...