2017-04-04 117 views
1

我在我查看这段代码,属于一种形式复选框增加每选择一个

<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

所以我接受检查的价值和附加的错误之后。有小费吗?

回答

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) 
} 
+0

我明白,所以我在哪里可以将ID绑定的复选框,保持所应当的价值? –

+0

您不应将id绑定到“复选框”。您可以将其添加为额外的隐藏字段,并将其绑定回具有2个字段的视图模型:Id和布尔检查状态。 –

+0

这是有益的,谢谢! –