У нас есть форма, в которой пользователь может перемещать элементы из одного окна с несколькими выборами в другое. Мы используем MVC 4.5 и jquery для проверки с помощью ненавязчивого javascript Microsoft.
Проблема заключается в том, что при отправке формы значения в пределах полей выбора не передаются, потому что пользователь не знает после перемещения элементов, что они также должны выбрать все эти элементы для отправки.
Таким образом, решение звучит просто: используйте jquery для выбора всех элементов при отправке.
Проведя некоторое исследование (спасибо сообществу stackoverflow), мы смогли обнаружить необходимый код jquery для перехвата процесса отправки. Однако возникает проблема в том, что, когда код выбирает элементы, выбираются только ранее существовавшие элементы в поле выбора. Живые (динамические) элементы, которые были перемещены, не выбираются.
Вот код, который мы впервые использовали:
$('#UserProfileForm').bind('invalid-form.validate',function(){
$(this).find('.selectbox option').each(function (i) {
$(this).attr("selected", "selected");
});
});
Мы обнаружили, что использование bind не работает, но вживую следует:
$('#UserProfileForm').live('invalid-form.validate',function(){
$(this).find('.selectbox option').each(function (i) {
$(this).attr("selected", "selected");
});
});
Однако мы используем jquery 1.9, и функция live была удалена. Он был заменен следующим:
$(document).on('invalid-form.validate', 'form', function () {
$(this).find('.selectbox option').each(function (i) {
$(this).attr("selected", "selected");
});
});
Однако это все еще не работает. Поэтому я заменил функцию выбора предупреждением, чтобы увидеть, работает ли оно вообще:
$(document).on('invalid-form.validate', 'form', function () {
alert('test');
});
Предупреждение не появляется. Есть идеи?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Для тех, кто задается вопросом, почему я ссылаюсь на invalid-form.validate, является то, что я тестирую недопустимые данные формы. Тот же сценарий будет применяться, если это действительные данные формы. Я просто не стал говорить о том, как привязывать данные в реальном времени к действительному процессу подачи формы.
После проверки элементов я заметил, что jquery добавлял выбранный атрибут к параметрам. Однако параметры не были выделены. Это заставило меня подумать, что, возможно, вызов jquery для добавления выбранного атрибута был неправильным.
После некоторых экспериментов я обнаружил, что это было неправильно. Похоже, что если вы используете функцию attr jquery, она фактически не устанавливает опцию для выбора в DOM. Использование функции prop делает.
Вот код:
$(document).on('submit', 'form', function (e) {
$(this).find('.selectbox option').each(function (i) {
$(this).prop("selected", true);
});
});
Это позволяет форме выбрать все параметры, выбранные при отправке формы, независимо от того, действителен ли обработчик отправки. Если вы просто хотите выбрать на основе неверной информации, используйте это:
$('form').bind('invalid-form.validate', function () {
$(this).find('.selectbox option').each(function (i) {
$(this).prop("selected", true);
});
});
Наслаждайтесь!