获取ASP.NET MVC 4中的Checkbox值

JQu*_*ile 116 c# asp.net-mvc-4

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

public class MyModel
{
    public string Name { get; set; }
    public bool Remember { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的表单中,我有以下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>
Run Code Online (Sandbox Code Playgroud)

当我发布表单时,模型中的记住值始终为false.但是,模型中的Name属性具有值.我通过在以下设置断点来测试这个:

[HttpPost]
public ActionResult MyAction(MyModel model)
{
  Console.WriteLine(model.Remember.ToString());
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚.为什么Checkbox值没有设置?

web*_*per 202

@Html.EditorFor(x => x.Remember)
Run Code Online (Sandbox Code Playgroud)

会产生:

<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />
Run Code Online (Sandbox Code Playgroud)

它是如何工作的:

  • 如果checkbox未选中,则表单仅提交hidden值(false)
  • 如果选中,则表单true将为模型的bool属性提交两个字段(false和true)和MVC集

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

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

  • 嗨,这种行为导致我的模型验证失败,因为它似乎无法弄清楚如何将[true,false]转换为单个布尔值.你是如何解决这个问题的? (7认同)
  • 如果您手动添加自己的复选框,则关键部分是**值**应设置为**"true"**,否则表单返回的**默认值**将为**"在"**和"上"不能绑定需要真/假的布尔.(您可能会看到验证错误,"on"值对_field_无效.) (6认同)
  • Html.EditorFor或Html.CheckBoxFor给出相同的结果 (5认同)
  • 如果使用了formCollection,则为复选框返回的字符串为:"true,false".你怎么解析这个?Replace()是唯一的选择吗? (3认同)

Dan*_*mer 66

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

因此,Remember的值为false,并将checkbox元素的值设置为false.这意味着当您选择复选框时,您将使用表单发布值"false".如果不选择它,则不会发布,因此模型默认为false.这就是为什么你在两种情况下都看到了错误的价值.

只有在选中复选框时才会传递该值.在Mvc中使用复选框

@Html.CheckBoxFor(x => x.Remember)
Run Code Online (Sandbox Code Playgroud)

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

@Html.CheckBox("Remember")
Run Code Online (Sandbox Code Playgroud)

当没有选择时,Mvc会使用隐藏字段来保持值.

编辑,如果你真的厌恶这样做,并希望自己生成元素,你可以做到.

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

  • `@ H​​tml.CheckboxFor`代码实际上应该是`@ Html.CheckBoxFor` (2认同)

小智 15

仅使用此功能

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


Rob*_*ert 5

代替

 <input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
Run Code Online (Sandbox Code Playgroud)

用:

 @Html.EditorFor(x => x.Remember)
Run Code Online (Sandbox Code Playgroud)

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