Checkbox会为每个选定的值添加额外的“false”值

时间:2017-04-04 09:47:32

标签: asp.net-mvc razor checkbox asp.net-mvc-5

我的View中有这段代码属于一个表单

<div class="col-md-10">
@foreach (var l in leads)
{
    @: @Html.CheckBox("cbLead", false, new { @value = @l.Id }) @Html.TextBox("worth", "") - @Html.Label(l.Name)
}
</div>

这是我处理帖子的形式:

[HttpPost]
public ActionResult Update(string[] cbLead, double[] worth)
{
    // code
}

我有24个复选框,但是对于选中的每个复选框,我在Update方法中收到2个值。因此,例如,如果我从24个复选框中选择3个,我会在字符串[] cblead中收到27个值。

包含24个复选框的示例:

3 first checkboxes selected

这就是我在方法中得到的结果:

enter image description here

所以我收到了检查的值,之后又添加了false。有什么提示吗?

1 个答案:

答案 0 :(得分:2)

这是因为Html.CheckBox助手会生成一个名称相同且值为false的其他隐藏字段。原因是因为如果未选中该复选框,则不会向服务器发送任何值,因此模型绑定器将无法正确绑定到模型上的布尔属性。另请注意,Html.CheckBox帮助程序期望您在模型上使用布尔值。您的语法不正确:

@Html.CheckBox("cbLead", false, new { @value = @l.Id })

您似乎尝试手动将复选框的value属性(使用帮助程序时不应该这样做)设置为模型的Id属性,我认为该属性不是布尔值,而是从屏幕截图中可以看到Guid。

这是设计和预期的行为。如果您不希望这种行为,您可以编写自己的自定义帮助程序或使用纯HTML。

我怀疑你需要在服务器上接收的是ID列表以及与元素是否被选中对应的布尔值。为此,我建议您编写以下视图模型:

public class MyViewModel
{
    public IList<LeadViewModel> Leads { get; set; }
}

public class LeadViewModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Worth { get; set; }
    public bool IsChecked { get; set; }
}

然后:

@for (var i = 0; i < Model.Leads.Count; i++)
{
    Html.CheckBoxFor(x => x.Leads[i].IsChecked)
    Html.HiddenFor(x => x.Leads[i].Id)
    Html.TextBoxFor(x => x.Leads[i].Worth) - 
    Html.LabelFor(x => x.Leads[i].Name)
}