У меня есть форма, на которой пользователь может вводить вопросы через текстовое поле. Нажав кнопку, он может динамически генерировать больше текстовых полей для ввода вопросов. Я использую Knockout с клиентской моделью просмотра, с которой связаны вопросы.Как я могу потребовать, чтобы массив имел хотя бы один элемент с помощью проверки на стороне клиента?
Мой упрощенный вид (Razor) выглядит следующим образом:
<div data-bind="foreach: openQuestions">
<div class="form-group">
<input type="hidden" data-bind="value: currentIndex" name="openQuestions.Index" />
<textarea class="form-control" rows="3" data-bind="value: question, attr: { name: 'openQuestions[' + $data.currentIndex + '].Question' }"/>
</div>
</div>
@Html.ValidationMessageFor(m => m.OpenQuestions)
Часть из Knockout VM:
function OpenQuestion() {
var self = this;
self.currentIndex = GetRandomIndex();
self.question = ko.observable();
}
function QuestionViewModel() {
var self = this;
self.openQuestions = ko.observableArray();
self.addOpenQuestion = function() {
self.openQuestions.push(new OpenQuestion());
}
}
Есть два валидация, которые должны произойти:
- ' Список OpenQuestions не должен быть пустым (так! = Null и> = 1 запись)
- Каждый вопрос в указанном списке не может быть пустым или нулевым.
У меня возникли трудности с подключением валидатора jQuery для проверки минимальной длины массива. Проблема, я думаю, в том, что когда страница загружена, нет элемента с именем «OpenQuestions», поскольку вопросов еще нет. Если вы представите на этом этапе, валидатор не сможет найти какие-либо элементы для проверки и просто предполагает, что все действительно, а это не так.
Я пробовал создать настраиваемый атрибут проверки минимальной длины, но я столкнулся с той же проблемой - с каким элементом вы ее подключаетесь?
В основном этот метод проверяет, может ли он найти какие-либо элементы, такие как предоставленное имя (например, «openquestions», но «openquestions [123456]» тоже будет работать) и сравнить эту длину с минимально необходимой длиной.
$.validator.addMethod("minarraylength",
function (value, element, parameters) {
var minLength = parameters["minlength"];
if (element) {
var elementName = $(element).attr("name").toLowerCase();
var actualLength = $("input").filter(function() {
var currentName = $(this).attr("name");
return currentName != undefined && currentName.toLowerCase().indexOf(elementName);
}).length;
return actualLength >= minLength;
}
return true;
}
);
В сочетании со скрытым полем, как так
@Html.HiddenFor(m => m.OpenQuestions)
будет инициировать проверку, но приведет к модели связующего к сбою на представить, так как по некоторым причинам он принимает значение из скрытого поля и игнорирует все остальное.
Итак, вопрос в том, как я могу подключить валидатор jQuery в свой динамически сгенерированный список, обеспечить привязку модели к обратной передаче, но предотвратить отправку пустых списков?
Заранее благодарен!
Кайл: Используется ли это с помощью jQuery/ненавязчивого валидатора ? Потому что я возился с выделенной базой валидации KO, но это в конечном итоге мешало ненавязчивой структуре. – rumblefx0
Пробовал это сегодня, кажется, работает отлично, спасибо! Небольшое предостережение, вам нужен пакет проверки KO (https: // github.com/Knockout-Contrib/Knockout-Validation) для этого. – rumblefx0
Да, это правильно. Я забыл упомянуть пакет проверки. Но рад, что ты это сделал! – Kyle