Подтвердить что ты не робот

Флажок MVC 3 всегда возвращает true, даже если он не установлен

У меня есть следующий код

@foreach (var item in Model.Defaults)
    {
        <tr class="CertainCategory">
            <td>
                @item.Item1
            </td>
            <td>
                @Html.CheckBoxFor(c => c.Use)
                @Html.Hidden("guid", guid.guid.ToString())
            </td>
        </tr>
    }

Я пытаюсь использовать AJAX для отправки значений формы методу контроллера. Моя проблема в том, что значение флажка всегда отправляется как true.

$('.CropUsageItem').each(function () {

            var guid = $(this).find("#guid").val();
            var chk = $(this).find("#use").val();
            var data = {
                guid: guid,
                chk: chk
            };

            $.ajax({
                async: false,
                type: "POST",
                url: "DefaultValues/SaveDefault",
                data: data
            });
        });

Я искал StackOverflow с похожими результатами, но ни один из них не полностью применим к моему сценарию. Как я могу отправить правильное значение?

4b9b3361

Ответ 1

Вы можете использовать следующую проверку, если флажок установлен.

var chk = $('#use').attr('checked');

или

var chk = $('#use').is(':checked'); 

Ответ 2

.val() возвращает содержимое атрибута value. поскольку он, вероятно, не равен null, который равен true.

Также проверьте свой корпус. JavaScript, css и поэтому также jQuery чувствительны к регистру.

Ответ 3

var chk = $('#use').checked;

работал у меня

Ответ 4

Как сказал Саймон,.val() возвращает атрибут value этого флажка, который может быть любым значением, которое вы хотите. Но более конкретно, он возвращает свойство value объекта DOM, которое инициализируется атрибутом. По умолчанию MVC устанавливает значение "true" по умолчанию, что для меня кажется бессмысленным. Но в некоторых случаях вам может потребоваться установить его идентификатор или какое-либо другое значимое значение для отмеченной опции в качестве этого потока.

Николай предоставил один хороший способ получить флажок выше. Установите и снимите флажок на этом jsfiddle для примера различных подходов и их результатов:

Проверено флажок JQuery


Краткое описание скрипта:

$("#use").val();  //Returns the value. Not related to checked state.
$("#use").attr("checked")  //Returns the checked attribute value. Does not change with checked state.
$("#use").prop("checked")  //Returns boolean checked state.
$("#use")[0].checked)  //Returns boolean checked state.
$("#use").is(":checked")  //Returns boolean checked state.

Обратите внимание, что результаты .val и .attr не изменяются. Это связано с тем, что свойство val не зависит от проверенного состояния, а фактический проверенный атрибут в разметке не обновляется при изменении флажка. Только свойство объекта DOM за кулисами, к которому относятся последние три метода.


Подробнее об этом см. в документации по API jQuery на .prop.