Отключить обязательную проверку с помощью 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();
}
})
});
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');
Вы можете использовать следующий JQuery, чтобы удалить все правила проверки вашего элемента
$('#ElementId').rules('remove');
Точно так же, как вы можете использовать имя класса, как,
$('.ElementClassName').rules('remove');
Если вы хотите удалить конкретное правило, сделайте так
$('#ElementId').rules('remove', 'required');
Ненавязчивый плагин javascript, предоставляемый MVC, не обрабатывает свойства данных на лету. Вместо этого он анализирует результаты в готовом документе и кэширует их.
Попробуйте позвонить $.validator.unobtrusive.parse(myForm)
в вашей форме после изменения рассматриваемого свойства, чтобы увидеть, дает ли оно ожидаемые результаты.
Ненавязчивая проверка ищет этот атрибут data-val="true"
Я думаю, что если вы сделаете $('#mycheckbox').data('val','false')
, проверка пропустит элемент с этим идентификатором.
Вероятно, есть более подходящий способ сделать это, но если нет, возьмите это.
веселит.
Есть много способов отключить ненавязчивую проверку в Javascript, но большинство из них выглядит немного хакерским...
- Недавно обнаружил, что вы можете сделать это с помощью кнопки отправки. Проверьте эту ссылку для информации
//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'));
},
Вам не нужно сбрасывать все сообщения, стили ввода и сводку проверки, чтобы иметь возможность отправить форму, но это полезно, если вы хотите изменить проверку после загрузки страницы. В противном случае, даже если вы измените проверку, предыдущие сообщения об ошибках все равно будут видны...
По умолчанию DataAnnotationsModelValidatorProvider
добавляет обязательный атрибут ко всем типам значений. Вы можете изменить это поведение, добавив код в ответ.
Вы можете реализовать собственный валидатор, такой как "RequiredIf".
Это сохранит дизайн вашей модели достаточно очевидным (в отличие от предлагаемых решений на стороне клиента). Это позволяет вам сохранить логику проверки отдельно от логики отображения (вот что такое MVC).
Смотрите этот ответ: Требуется, если атрибут условной проверки
и, в конечном итоге, это сообщение в блоге: условная проверка в ASP.NET MVC 3
ура!