我的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个复选框的示例:
这就是我在方法中得到的结果:
所以我收到了检查的值,之后又添加了false。有什么提示吗?
答案 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)
}