Получение значения Checkbox в ASP.NET MVC 4

Я работаю над приложением ASP.NET MVC 4. Это приложение имеет базовую форму. Модель для моей формы выглядит следующим образом:

public class MyModel
{
    public string Name { get; set; }
    public bool Remember { get; set; }
}

В моей форме у меня есть следующий HTML.

<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember">&nbsp;Remember Me?</label>

Когда я отправляю форму, значение Remember в модели всегда ложно. Однако свойство Name в модели имеет значение. Я проверил это, установив точку останова в следующем:

[HttpPost]
public ActionResult MyAction(MyModel model)
{
  Console.WriteLine(model.Remember.ToString());
}

Я не могу понять. Почему значение Checkbox не установлено?

Ответ 1

@Html.EditorFor(x => x.Remember)

Будет генерировать:

<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />

Как это работает:

  • Если checkbox не установлен, форма отправляет только hidden значение (false)
  • Если флажок установлен, то форма отправляет два поля (false и true), а MVC устанавливает значение true для свойства model bool

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember"/>

Это всегда будет отправлять значение по умолчанию, если отмечено.

Ответ 2

Поскольку вы используете Model.Name для установки значения. Я предполагаю, что вы передаете пустую модель представления в представление.

Итак, значение для Remember является false и устанавливает значение в элементе checkbox равным false. Это означает, что, когда вы затем установите флажок, вы публикуете значение "false" с формой. Если вы его не выбрали, он не будет отправлен, поэтому для модели по умолчанию используется значение false. Вот почему вы видите ложное значение в обоих случаях.

Значение передается только при проверке поля выбора. Чтобы сделать флажок в Mvc, используйте

@Html.CheckBoxFor(x => x.Remember)

или если вы не хотите привязывать модель к виду.

@Html.CheckBox("Remember")

Mvc делает магию со скрытым полем для сохранения значений, когда они не выбраны.

Изменить, если у вас действительно есть отвращение к этому, и вы хотите создать элемент самостоятельно, вы можете сделать.

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />

Ответ 3

Используйте только этот

$("input[type=checkbox]").change(function () {
    if ($(this).prop("checked")) {
        $(this).val(true);
    } else {
        $(this).val(false);
    }
});

Ответ 4

Хорошо, флажок немного странный. Когда вы используете хелпер Html, он генерирует два входа checkbox в разметке, и оба они передаются в качестве пары имя-значение IEnumerable, если она проверена.

Если он не проверяется на разметке, он передается только в скрытом входе, значение которого имеет значение false.

Так, например, на разметке у вас есть:

      @Html.CheckBox("Chbxs") 

И в действии контроллера (убедитесь, что имя соответствует флажку param name на контроллере):

      public ActionResult Index(string param1, string param2,
      string param3, IEnumerable<bool> Chbxs)

Затем в контроллере вы можете сделать что-то вроде:

      if (Chbxs != null && Chbxs.Count() == 2)
        {
            checkBoxOnMarkup = true;
        }
        else
        {
            checkBoxOnMarkup = false;
        }

Я знаю, что это не изящное решение. Надеюсь, что кто-то здесь может дать некоторые указатели.

Ответ 5

Вместо

 <input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

использование:

 @Html.EditorFor(x => x.Remember)

Это даст вам флажок специально для "Запомнить"

Ответ 6

Чтобы преобразовать значение, возвращенное из флажка в форме, к логическому свойству, я использовал ValueProviderResult в конвертере сборки в пользовательском ModelBinder.

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));

Ответ 7

Я столкнулся с подобной проблемой и смог вернуть значение флажка, используя флажок, скрытый и маленький JQuery:

@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)

<script>

    $("#isPreferred").change(function () {

        $("#IsPreferred").val($("#isPreferred").val());

    })

</script>

Ответ 8

Это была большая боль, и она чувствует, что это должно быть проще. Здесь моя настройка и решение.

Я использую следующий HTML-помощник:

@Html.CheckBoxFor(model => model.ActiveFlag)

Затем в контроллере я проверяю сбор и обработку формы соответственно:

bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;

Ответ 9

@Html.EditorFor(x => x.ShowComment)


$(function () {
        // set default value to control on document ready instead of 'on'/'off' 
        $("input[type='checkbox'][name='ShowComment']").val(@Model.ShowComment.ToString().ToLower());
    });

    $("#ShowComment").change(function() {
        // this block sets value to checkbox control for "true" / "false"

        var chkVal = $("input[type='checkbox'][name='ShowComment']").val();
        if (chkVal == 'false') $("input[type='checkbox'][name='ShowComment']").val(true);
        else $("input[type='checkbox'][name='ShowComment']").val(false);

    });

Ответ 10

Для MVC с использованием модели. Модель:

public class UserInfo
{
    public string UserID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool RememberMe { get; set; }
}

HTML:

<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/>
<label for="checkbox1"></label>

В функции [HttpPost] мы можем получить его свойства.

[HttpPost]
public ActionResult Login(UserInfo user)
{
   //...
   return View(user);
}

Ответ 11

Я просто столкнулся с этим (я не могу поверить, что он не связан вкл/выкл!)

В любом случае!

<input type="checkbox" name="checked" />

Выведет значение "on" или "off".

Этот WONT связывается с логическим, но вы можете сделать это глупое обходное решение!

 public class MyViewModel
 {
     /// <summary>
     /// This is a really dumb hack, because the form post sends "on" / "off"
     /// </summary>                    
     public enum Checkbox
     {
        on = 1,
        off = 0
     }
     public string Name { get; set; }
     public Checkbox Checked { get; set; }
}

Ответ 12

Для нескольких флажков с тем же именем... Код для удаления ненужного false:

List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1"));
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1);

Функция

public class form_checkbox
{

    public static List<string> RemoveExtraFalseFromCheckbox(List<string> val)
    {
        List<string> d_taxe1_list = new List<string>(val);

        int y = 0;

        foreach (string cbox in val)
        {

            if (val[y] == "false")
            {
                if (y > 0)
                {
                    if (val[y - 1] == "true")
                    {
                        d_taxe1_list[y] = "remove";
                    }
                }

            }

            y++;
        }

        val = new List<string>(d_taxe1_list);

        foreach (var del in d_taxe1_list)
            if (del == "remove") val.Remove(del);

        return val;

    }      



}

Используйте его:

int x = 0;
foreach (var detail in d_prix){
factured.taxe1 = (d_taxe1[x] == "true") ? true : false;
x++;
}

Ответ 13

public ActionResult Index(string username, string password, string rememberMe)
{
   if (!string.IsNullOrEmpty(username))
   {
      bool remember = bool.Parse(rememberMe);
      //...
   }
   return View();
}

Ответ 14

Изменить Помните, как это

public class MyModel
{
    public string Name { get; set; }
    public bool? Remember { get; set; }
}

Используйте nullable bool в контроллере и отмените значение false на null, как этот

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    model.Remember = model.Remember ?? false;
    Console.WriteLine(model.Remember.ToString());
}

Ответ 15

В моем случае я не устанавливал свойство модели "Запомнить" в методе get. Проверьте свою логику в контроллере. Вы можете делать то же самое. Надеюсь, эта помощь!

Ответ 16

Если вы действительно хотите использовать простой HTML (по любой причине), а не встроенные расширения HtmlHelper, вы можете сделать это следующим образом.

Вместо

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

попробуйте использовать

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") />

Входные данные флажка в HTML работают так, что когда они проверены, они отправляют значение, а когда они не проверены, они вообще ничего не отправляют (что приведет к откату ASP.NET MVC к значению по умолчанию поле, false). Кроме того, значение флажка в HTML может быть чем угодно, не просто true/false, поэтому, если вы действительно хотите, вы можете даже использовать флажок для строкового поля в вашей модели.

Если вы используете встроенный Html.RenderCheckbox, он фактически выводит два ввода: флажок и скрытое поле, так что ложное значение отправляется, когда флажок снят (не просто ничего). Это может вызвать некоторые неожиданные ситуации, например:

Ответ 17

Я прочитал другие ответы и не смог заставить его работать - вот решение, которое я выбрал.

Моя форма использует Html.EditorFor(e => e.Property) для создания флажка, и, используя FormCollection в контроллере, он передает строковое значение 'true,false' в контроллере.

Когда я обрабатываю результаты, я использую цикл для их циклического просмотра - я также использую экземпляр InfoProperty для представления значения текущей модели, оцениваемого из формы.

Поэтому вместо этого я просто проверяю, начинается ли возвращаемая строка со слова 'true' а затем устанавливаю логическую переменную в значение " true и передаю ее в возвращаемую модель.

if (KeyName.EndsWith("OnOff"))
{
    // set on/off flags value to the model instance
    bool keyTrueFalse = false;
    if(values[KeyName].StartsWith("true"))
    {
        keyTrueFalse = true;
    }
    infoProperty.SetValue(processedInfo, keyTrueFalse);
}

Ответ 18

При работе с FormCollection, а не с моделью, назначение может быть таким простым:

MyModel.Remember = fields["Remember"] != "false";

Ответ 19

У меня есть вопросник, на первой странице, если пользователь устанавливает флажок (генерируется с помощью кода ниже) @Html.CheckBoxFor(x => x.markforreview, Model.markforreview) Отметить для просмотра

на следующей странице это не должно быть проверено, и когда пользователь возвращается к предыдущему, это должно быть проверено. ничего не работает, при отладке представления показывает, что все выполняется правильно, но когда страница отображается, флажок для любого вопроса, который проходит пользователь... Я не знаю, почему не работает этот помощник html, я попробовал все.