Как отправить флажок без отметки
Если флажок не установлен, нажатие кнопки отправки формы не передает никаких данных.
Некоторые флажки могут отсутствовать в форме в зависимости от полей формы, выбранных пользователем. Таким образом, у диспетчера отправки нет возможности определить, присутствует ли флажок без отметки в форме или нет.
Если база данных содержит true для этого столбца, это свойство не обновляется до значения false.
Имя флажка совпадает с именем булевого столбца базы данных.
Как форсировать форму для отправки флажков, которые находятся в состоянии unchecked или какой-либо другой идеи, чтобы
установить значение в базе данных на false, если флажок не установлен, но не изменять значение в базе данных, если флажок отсутствует в форме?
jquery, jqueryui, asp.net 2 mvc используются
Ответы
Ответ 1
Это распространенная проблема с флажками в HTML-формах и не уникальна для ASP.NET.
Ответ должен состоять из скрытого поля, которое прилагается к каждому флажку. Когда флажок изменен, используйте событие на стороне клиента, чтобы обновить скрытое поле.
Скрытое поле всегда будет отправлено.
Однако, поскольку вы используете ASP.NET MVC, если вы используете помощник HTML.CheckBoxFor
, он автоматически обработает это для вас.
Ответ 2
Это очень распространенная проблема - когда флажок не выбран, он не отправляет на сервер значение off/false самостоятельно. Самый популярный ответ, который я нашел, - это добавить скрытое поле с тем же именем, что и флажок, а value = false. Но потом, когда кто-то проверил это, он отправил мне два значения.
И мне это не понравилось. Это то, что я сделал:
Где-то в HTML:
<input type="checkbox" name="${name}" onclick="true" >
В JQuery:
Первый шаг - установить скрытые значения во всех флажках, которые не отмечены.
$(document).ready(function () {
$(".checkbox").each(function () {
if ($(this).prop("checked") == undefined) {
$(this).after("<input type=\"hidden\" name=\"" + $(this).attr("name") + "\" value="off">")
}
}
)
});
Во-вторых, мы должны отреагировать на пользователя, щелкнув флажок: при отмене выбора скрытого поля при выборе - удалить следующего брата в DOM - мы ожидали, что там будет скрытое поле.
ПРЕДУПРЕЖДЕНИЕ. Если флажки имеют общий родительский элемент, вы должны проверить, скрыт ли следующий тип родного брата, а затем удалить его:
$(".checkbox").click(function () {
if ($(this).prop("checked") == undefined) {
$(this).after("<input type=\"hidden\" name=\"" + $(this).attr("name") + "\" value=off>")
} else {
$(this).next().remove();
}
}
);
И это работает для меня:)
Ответ 3
Самое короткое решение: используйте флажок onchange() для установки скрытого брата на 0 или 1. Как показано ниже:
var htm = '<input type="checkbox" '+(isMale>0?"checked":"")+' onchange="this.nextSibling.value=this.checked==true?1:0;" /><input type="hidden" name="Gender" value="'+isMale+'" />';
Отправить ТОЛЬКО отправляет скрытый родной брат, а не флажок, потому что он не имеет атрибута имени. Таким образом, приведенное выше сериализуется как "... & Gender = 1..." или "... & Gender = 0..." в зависимости от значения isMale.
Ответ 4
Я столкнулся с подобной проблемой при использовании jQuery/Java. Вместо использования дополнительного скрытого поля я принудительно подавал заявку каждый раз, когда форма сохранялась независимо от того, были ли поля изменены.
например. Если chkBox1 =unchecked
(отправит атрибут значения null-control value через jQuery onClick или событие onChange)
<input name="chkBox1 " class="editable-value" id="chkBox1 " style="display: inline;" type="checkbox" data-type="A" data-original-value="checked" data-force-save="true" value="N"/>
и ChkBox2=checked
(отправит Y)
<input name="ChkBox2" class="editable-value" id="ChkBox2" type="checkbox" CHECKED="Y" data-type="A" data-original-value="checked" value="Y">
- это значения на экране, и я пытаюсь сохранить данные, в своем Java-коде я выполняю нулевую проверку значения, полученного в getter, и интерпретирую null как "N".
Это позволяет избежать накладных расходов на скрытое поле, хотя можно свободно выбирать решение, которое учитывает их конкретную ситуацию.
Ответ 5
Недавно я оказался в этой проблеме, и это мое решение.
Я делаю это без скрытого поля.
Просто измените "значение" флажка на "выключено" и убедитесь, что он установлен так, чтобы он был отправлен.
Примечание. Я тестировал только сервер php, но он должен работать.
// Prepare checkboxes
var checkboxes = document.querySelectorAll('input[type="checkbox"]')
checkboxes.forEach(function(cbox) {
if (!cbox.checked) { // If the checkbox is checked it keeps its value, default value is 'on'
cbox.value='off' // Otherwise change the value to off, or something else
cbox.checked = true // We need to check it, so it sends the value
}
})