获取ASP.NET MVC 4中的Checkbox值

时间:2013-02-06 13:52:08

标签: c# 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值始终为false。但是,模型中的Name属性具有值。我通过在下面设置断点来测试这个:

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

我无法理解。为什么Checkbox值没有设置?

18 个答案:

答案 0 :(得分:195)

@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属性
  • bool

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

如果选中,它将始终发送默认值。

答案 1 :(得分:64)

因为您使用Model.Name来设置值。我假设您将空视图模型传递给View。

因此,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\"" : "") />

答案 2 :(得分:10)

仅使用此

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

答案 3 :(得分:4)

好的,复选框有点奇怪。 使用Html帮助程序时,它会在标记上生成两个复选框输入,如果选中它们,它们都将作为IEnumerable的名称 - 值对传入。

如果没有在标记上检查,它只会传入值为false的隐藏输入。

例如,你有标记:

      @Html.CheckBox("Chbxs") 

在控制器操作中(确保名称与控制器上的复选框参数名称匹配):

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

然后在控制器中你可以做一些事情:

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

我知道这不是一个优雅的解决方案。希望有人在这里给出一些指示。

答案 4 :(得分:3)

要将表单中复选框返回的值转换为布尔属性,我在自定义ModelBinder中使用构建转换器中的ValueProviderResult。

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

答案 5 :(得分:3)

而不是

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

使用:

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

这将为您提供专门用于记住的复选框

答案 6 :(得分:2)

我遇到了类似的问题,并且能够通过使用复选框,隐藏和小JQuery来获取复选框值,如下所示:

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

<script>

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

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

    })

</script>

答案 7 :(得分:2)

这是一个很大的痛苦,感觉它应该更简单。这是我的设置和解决方案。

我使用以下HTML帮助器:

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

然后,在控制器中,我正在检查表单集合并进行相应的处理:

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

答案 8 :(得分:1)

@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);

    });

答案 9 :(得分:1)

对于使用Model的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);
}

答案 10 :(得分:0)

如果使用FormCollection而不是模型,则分配可以很简单:

 Column_name     Type     Computed     Length     Prec     Scale     Nullable     TrimTrailingBlanks     FixedLenNullInSource     Collation    
 --------------  -------  -----------  ---------  -------  --------  -----------  ---------------------  -----------------------  ------------ 
 n               money    no           8          19       4         no           (n/a)                  (n/a)                    (null)       

答案 11 :(得分:0)

我通读了其他答案,并没有让它发挥作用 - 所以这就是我最终解决的问题。

我的表单使用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);
}

答案 12 :(得分:0)

如果您真的想使用纯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中复选框的值可以是任何不仅是真/假的值,因此如果您真的想要,您甚至可以使用模型中字符串字段的复选框。

如果您使用内置Html.RenderCheckbox,它实际上会输出两个输入:复选框和隐藏字段,以便在取消选中复选框时发送错误值(不只是没有)。这可能会导致一些意外情况,例如:

答案 13 :(得分:0)

在我的情况下,我没有设置模型属性&#34;记住&#34;在get方法中。检查控制器中的逻辑。你可能也在这样做。我希望这有帮助!

答案 14 :(得分:0)

修改记住这样

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

在控制器中使用nullable bool,并在null上回退为false

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

对于具有相同名称的多个复选框...删除不必要的错误的代码:

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++;
}

使用它:

meteor add twbs:bootstrap

答案 17 :(得分:0)

我刚碰到这个(我不敢相信它不会打开/关闭!)

反正!

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

将发布“开”或“关”的值。

这个 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; }
}