获取ASP.NET MVC 4中的checkbox值

我正在开发一个ASP.NET MVC 4应用程序。 这个程序有一个基本的forms。 我的表单模型如下所示:

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> 

当我发布表单时,模型中的记住值始终为false。 但是,模型中的Name属性有一个值。 我已经通过在下面设置了一个断点来testing这个:

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

我无法弄清楚。 为什么没有设置checkbox的值?

 @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" />

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

由于您正在使用Model.Name来设置值。 我假设你将一个空的视图模型传递给View。

因此,Remember的值为false,并将checkbox元素的值设置为false。 这意味着当您selectcheckbox时,您将在窗体中发布值“false”。 如果不select它,则不会发布,因此该模型默认为false。 这就是为什么你在这两种情况下看到一个虚假的价值。

该值只有在您选中该checkbox时才会通过。 在Mvc中使用checkbox

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

或者如果您不想将模型绑定到视图。

 @Html.CheckBox("Remember") 

Mvc用一个隐藏的字段来做一些魔法,当它们没有被选中的时候保持这个值。

编辑,如果你真的厌恶这样做,并想自己产生的元素,你可以这样做。

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

代替

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

使用:

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

这会给你一个专门用于记住的checkbox

好的,checkbox有点奇怪。 当您使用Html帮助器时,它会在标记上生成两个checkboxinput,并且如果选中它们,它们将作为IEnumerable的名称 – 值对传入。

如果没有在标记上进行检查,它只会被传入具有值为false的隐藏input。

所以例如在你有标记:

  @Html.CheckBox("Chbxs") 

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

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

然后在控制器中,你可以做一些东西,如:

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

我知道这不是一个优雅的解决scheme。 希望这里的某个人能给一些指点。

将从窗体中的checkbox返回的值转换为布尔属性在定制的ModelBinder中,我在构build转换器中使用了ValueProviderResult。

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

我碰到类似的问题,并能够通过使用checkbox,隐藏和小JQuery像这样获取checkbox值:

 @Html.CheckBox("isPreferred", Model.IsPreferred) @Html.HiddenFor(m => m.IsPreferred) <script> $("#isPreferred").change(function () { $("#IsPreferred").val($("#isPreferred").val()); }) </script> 
 @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); }); 

这是一个主要的痛苦,感觉应该是更简单。 这是我的设置和解决scheme。

我正在使用下面的HTML帮助器:

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

然后,在控制器中,我正在检查表单收集和相应处理:

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

只使用这个

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

我刚碰到这个(我简直不敢相信它没有绑定/closures!)

无论如何!

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

对于具有相同名称的多个checkbox…代码删除不必要的错误:

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

function

 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++; } 
 public ActionResult Index(string username, string password, string rememberMe) { if (!string.IsNullOrEmpty(username)) { bool remember = bool.Parse(rememberMe); //... } return View(); } 

修改像这样记住

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

在控制器中使用可空布尔值,并像这样在空值上回退到false

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

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