Отключить обязательную проверку с помощью JavaScript

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

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

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

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

Какая-то идея?

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

ОБНОВИТЬ:

Вот код 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();
                        }
                    })
            });

person Tobias    schedule 12.09.2011    source источник


Ответы (7)


Я обрабатывал подобные случаи с помощью специального атрибута проверки. Вместо использования атрибута 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');
person bbak    schedule 12.09.2011
comment
lol, все, что я хотел сделать, это добавить поля поиска на страницу индекса. Благодарность - person Mike_Matthews_II; 25.04.2015

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

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

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

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

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

$('#ElementId').rules('remove', 'required');
person Karthikeyan P    schedule 27.08.2015

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

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

person DMac the Destroyer    schedule 12.09.2011

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

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

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

ваше здоровье.

person vtortola    schedule 12.09.2011
comment
Флажок показывает или скрывает поля ввода. Как я уже писал, я уже пытался установить для свойства data-val всех полей ввода значение false. - person Tobias; 12.09.2011

Есть много способов отключить ненавязчивую проверку в 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" />
  1. Другой способ, более гибкий, но более сложный: вы можете отключить ненавязчивую проверку, установив для атрибута 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'));
},

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

person Gudradain    schedule 11.11.2014
comment
Первый вариант, похоже, не работает для меня в MVC4. - person Tridus; 08.07.2015

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

person counsellorben    schedule 12.09.2011

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

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

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

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

ваше здоровье!

person fredlegrain    schedule 13.09.2011