获取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"> 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方法中设置模型属性“记住”。 检查你的控制器的逻辑。 你可能也在做同样的事情。 我希望这有帮助!