Как отправить флажок без отметки

Если флажок не установлен, нажатие кнопки отправки формы не передает никаких данных.

Некоторые флажки могут отсутствовать в форме в зависимости от полей формы, выбранных пользователем. Таким образом, у диспетчера отправки нет возможности определить, присутствует ли флажок без отметки в форме или нет.

Если база данных содержит 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
        }
    })