根據W3C的規則未選中的checkbox和禁用的控制元件不是有效控制元件,不會被POST。因此如果要未選中的checkbox表示值0的話,就不得不曲線完成了。

最近研究Zend Framework時候,發現其中的一個方法formCheckbox()。這個方法是生成checkbox表單的。但是它在生成checkbox的之前會生成一個hidden表單。這種做法很巧妙。

比如:

<input type="hidden" name="foo" value="0">
<input type="checkbox" name="foo" id="foo" value="1">

生成這樣的表單,當checkbox未選中的時候,提交的是hidden表單。值0就被提交到伺服器了。

當checkbox都選中的時候,hidden和checkbox表單都被提交了,但是因為它們的name是一樣的,所以hidden的值被checkbox覆蓋了。所以就得到了數值1。

這種方法簡單巧妙,值得推廣。

經測試,在PHP中,如果有多個name相同的表單,post到伺服器,後臺僅取最後一個表單的值。而在ASP.NET中,會把這個多個表單的值合併成逗號分割的值。因此,這種方法用在PHP下更合適。