【问题标题】:Checkbox is checked but Model is still false复选框已选中,但模型仍然为假
【发布时间】:2015-04-03 14:25:37
【问题描述】:

我有以下型号:

  public class TaskViewModel{
   //other properties are omitted for brevity
    public bool IsUnderControl{get;set;}
  }

另一方面,我将这两个 DOM 元素手动绑定到模型属性:

<input type="checkbox" name="IsUnderControl" value="true"/>
<input type="hidden" name="IsUnderControl" value="false" />

现在,提交后,IsUnderControl 的值即使选中复选框也是 false。这是 POST 方法:

[HttpPost]
public void SaveTask(TaskViewModel tvm){
   //When I debug the code I see that tvm.IsUnderControl=false
   if (ModelState.IsValid){
     //I save the task to repository
  }
}

*注意:当我检查复选框时,我发现元素复选框属性中没有 checked="checked"

编辑:这是我用来创建相应输入元素的 javascript:

$('#taskConfig').
   append('<input type="checkbox"  value="true" 
   name="IsUnderControl"/>').append('<input type="hidden" value="false"    
   name="IsUnderControl"/>');

【问题讨论】:

  • 您是否尝试过使用 HTML Helper 代替? @Html.CheckBoxFor(m =&gt; m.IsUnderControl)
  • 那是public bool IsUnderControl { get; set; } 吗? POST 方法的签名是什么?
  • 我认为您没有将模型属性与复选框绑定。尝试使用 Html.Checkbox 或 Html.CheckboxFor。
  • 是的,@StephenMuecke,它是公开的。我也添加了 POST 方法
  • checked="checked" 仅在您使用@Html.CheckBoxFor(m =&gt; m.IsUnderControl) 实际绑定到您的属性并且IsUnderControl 的值为true 时才会设置

标签: asp.net-mvc checkbox model-binding


【解决方案1】:

首先,我要感谢@Stephen Muecke 的帮助。他的建议帮助我排除了可能的错误,我终于找到了我的错误所在。我使用实体框架,但我没有找到更好的方法将布尔属性连接到 Oracle 数据库中的列,而不是使用另一个名为 IsUnderControlInt 的属性并在 getter 和 setter 中将此属性转换为布尔值或从该属性转换为布尔值方法。像这样:

[Column("ISUNDERCONTROL")]
public int IsUnderControlInt {get;set;}
[NotMapped]
public bool IsUnderControl 
{
   get {return Convert.ToBoolean(IsUnderControlInt);}
   set IsUnderControlInt=Convert.ToInt32(value);//This is correct
}

我在设置器中犯了一个错误:我没有将传递的value 转换为 Int32,而是在转换自己,如下所示:

 set IsUnderControlInt=Convert.ToInt32(IsunderControl);This is incorrect

这就是为什么它从未设置为 true。现在效果很好。谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    相关资源
    最近更新 更多