Как поставить не отмеченный флажок также - PullRequest
12 голосов
/ 29 сентября 2011

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

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

Если база данных содержит true для этого столбца, это свойство не обновляется до false. Имя флажка совпадает с именем логического столбца базы данных.

Как заставить форму отправлять флажки, которые находятся в непроверенном состоянии, или любую другую идею установить значение в базе данных на false, если флажок не установлен, но не изменять значение в базе данных, если флажок отсутствует в форме?

Используются jquery, jqueryui, asp.net 2 mvc

Ответы [ 5 ]

10 голосов
/ 29 сентября 2011

Это распространенная проблема с флажками в формах HTML, которая не является уникальной для ASP.NET.

Ответ должен иметь скрытое поле, которое сопровождает каждый флажок. Когда флажок изменен, используйте событие на стороне клиента для обновления скрытого поля.

Скрытое поле всегда будет отправлено.

Тем не менее, поскольку вы используете ASP.NET MVC, если вы используете хелпер HTML.CheckBoxFor, он будет обрабатывать это автоматически.

6 голосов
/ 21 декабря 2012

Это очень распространенная проблема - если флажок не установлен, он не будет отправлять на сервер значение off / false само по себе.Самый популярный ответ, который я нашел, это добавить скрытое поле с тем же именем, что и у флажка, и значение = 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();
                    }
                 }
           );

И у меня это работает :) 1024 *

3 голосов
/ 18 апреля 2015

Мое самое короткое решение: используйте событие 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+'" />';

Submit ТОЛЬКО отправляет скрытого брата, а НЕ флажок, потому что у него нет атрибута имени. Таким образом, вышеприведенное сериализуется как "... & Gender = 1 ..." или "... & Gender = 0 ..." в зависимости от значения isMale.

1 голос
/ 30 октября 2017

Я недавно оказался в этой проблеме, и это мое решение.Я делаю это без скрытого поля.Просто измените 'значение' флажка на 'выключен', и убедитесь, что он отмечен, чтобы он был отправлен.Примечание: я тестировал только на 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
        }
    })
0 голосов
/ 30 ноября 2015

Я столкнулся с подобной проблемой при использовании jQuery / Java. Вместо использования дополнительного скрытого поля я принудительно отправлял данные каждый раз при сохранении формы независимо от того, были ли поля изменены.

например, если chkBox1 =unchecked (отправит нуль - атрибут управляющего значения через 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-коде я выполняю нулевую проверку значения, полученного в геттере, и интерпретирую ноль как 'N'.Это позволяет избежать накладных расходов на скрытое поле, хотя можно свободно выбирать решение, соответствующее их конкретной ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...