布尔模型属性的值不会在POST方法中绑定

时间:2016-01-21 12:12:59

标签: c# asp.net-mvc razor

我的表记录如下

enter image description here

这是如何在模型类中定义的两个属性

    public bool? Report_Users { get; set; }
    public bool? Innovation_Discussion_User { get; set; }

这是Form语法,用于填充复选框中的布尔值

            @Html.CheckBox("Report User", Model.Report_Users.GetValueOrDefault(), new { @value = "false" }) Report User
              
            @Html.CheckBox("Innovation Discussion User", Model.Innovation_Discussion_User.GetValueOrDefault(), new { @value = "false" }) Innovation Discussion User

这是该表格的复选框视图

enter image description here

但是一旦我提交,我可以在模型中看到这两个属性值在POST方法中变为空

如何正确地将此复选框值绑定到布尔属性字段?

1 个答案:

答案 0 :(得分:0)

您的实施存在许多问题。

您的CheckBox("Report User", ...)方法正在为name="Report"生成一个复选框(以及相关的隐藏输入),并且您的模型不包含名为Report的属性。因为Report_Users没有回发任何值,所以它的值将始终是POST方法中的默认值(null)。为了绑定到bool? Report_Users,它必须是CheckBox("Report_User", ...)(下划线而不是空格)。

但是,更改此值意味着Report_User的值现在始终为false而不是null,因为您已添加new { @value = "false" }CheckBox()方法会生成2个输入<input type="checkbox".. value="True" /><input type="hidden".. value="False" />,以便正确绑定到您的媒体资源。您现在已覆盖它以生成<input type="checkbox".. value="false" />,因此即使选中此复选框,也会发布false的值。

但是,您的代码的真正问题是您的属性为bool?(可为空),而CheckBox()旨在绑定到bool。 typeof bool?有3个状态(true / false / null),而复选框有2个状态(开/关或真/假)。不清楚为什么您的数据库属性可以为空,但如果您无法更改它,那么(一如既往)使用具有bool属性的视图模型。在GET方法中,将数据模型映射到视图模型时,可以使用

myViewModel.ReportUser = myDataModel.Report_User.GetValueOrDefault();

现在您可以使用强类型助手

正确构建视图
@Html.CheckBoxFor(m => m.ReportUser)
@Html.LabelFor(m => m.ReportUser, "Report User") // use a label
// or add [Display(Name="Report User")] and use @Html.LabelFor(m => m.ReportUser)

从中学到什么:

  1. 如果您的模型没有绑定,请始终检查您生成的html (表单控件的name属性必须与名称匹配 财产)
  2. 始终使用强类型xxxxFor() HtmlHelpers进行生成 表格控件。你不仅得到了智能感知,它确保了 生成正确的name属性,并报告任何错误
  3. 使用时,切勿尝试更改value属性 HtmlHelpers(或name属性)。助手产生了 根据模型属性更正html并从中更改它们 默认值只会导致模型绑定失败