@Html.CheckBoxFor为何输出两种控件
在MVC中当使用@Html.CheckBoxFor时表单上会产生两种控件checkbox和hidden,比如:
@Html.CheckBoxFor(model => model.IsTop)
对应
<input type ="checkbox" id="IsTop" name="IsTop" value="true"/> <input type ="hidden" name="IsTop" value="false"/>
为何???且看关与Checkbox value 属性的定义和使用:
value 属性可设置或者返回 checkbox 的value属性值。
复选框的 value 属性值不会显示在用户界面中。value 属性用于表单数据的提交(只有选中的复选框才会传递数据到服务端,如果什么都没选则不传递复选框数据)。
至此就应该明白了。
当未选中复选框时,在Controller中接受到的数据为”false”,该值来自hidden控件,checkbox的值不会被传递,所以如果没有同名的hidden控件,那么在Controller中是得不到[IsTop]参数的。
当选中复选框时,在Controller中接受到的数据就为”true,false”。
那么问题又来了,字符串”false”,”true”可以转换成bool类型,那么”true,false”也可以吗?答案自然是不可以的。
那MVC中又是如何转换的呢?这里恕我没查源码,不能告知,但可以猜测是做了字符串的分割,以”,”为分隔符,取第一个子字符串。
另外如果我们不使用HTML辅助方法的形式,而是直接写两种控件,需要注意checkbox和hidden控件的顺序不能颠倒,不然绑定到的值一直为”false”。
在一注意,checkbox选中时value默认值为”on”,需要显示为value赋值为”true”。
说明:示例中的[IsTop]字段为bool类型。