在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類型。