【问题标题】:Checkbox adds extra "false" value per selected one复选框为每个选定的复选框添加额外的“假”值
【发布时间】:2017-08-29 10:43:10
【问题描述】:

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

<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 个,我会在 string[] cblead 中收到 27 个值。

带有 24 个复选框的示例:

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

所以我收到检查的值并在之后添加错误。有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    这是因为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)
    }
    

    【讨论】:

    • 我明白了,那么我在哪里可以将 Id 绑定到复选框,并保持其应有的值?
    • 您不应将 id 绑定到 checkbox。您可以将其添加为额外的隐藏字段并将其绑定回具有 2 个字段的视图模型:Id 和布尔检查状态。
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2019-03-14
    • 2016-09-01
    • 2014-02-21
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多