在HTML中,input標簽可以通過type屬性設置為checkbox。同時,也就包含了一個checked屬性。對於這個checked屬性,有一個特別的地方就是,它可以不需要屬性值就可以表示是否選擇了。這背后的原因是源自於早期的HTML,checked是一個獨立的boolean屬性。
所以給1)checked賦值true
<input type="checkbox" checked="true" />
和2)直接寫checked
<input type="checkbox" checked />
是等價的。
我在按照精通ASP.NET MVC4 和精通ASP.NET MVC5第5.4.2節中按照書中例子寫了代碼如下:
Discount:<input type="checkbox" checked ="@ViewBag.ApplyDiscount"/> Express:<input type="checkbox" checked ="@ViewBag.ExpressShip"/> Supplier:<input type="checkbox" checked ="@ViewBag.Supplier"/>
這里在checked 和 等號之間有一個空格,這就導致了razor在解析的時候直接把checked按照上面說的第二種方式解析了,這就導致了三個選項都被勾選,而且后面的ViewBag對象的屬性被直接解釋為了各自本來的意思。而不是按照書上所說,根據值得不同要么直接不解析checked屬性,要么checked屬性被賦值為checked即checked="checked"。上面的代碼去掉空格就可以正確顯示了。這也提醒我,在寫checked屬性時不要手賤打空格。
書里面在這一節最后一段第二句說的不明不白的,這里並不是翻譯的問題,我找到了原書,原書寫的也是不明不白。書中是這樣說的:
“如果Razor插入False、null或者空字符串作為checked標簽屬性的值,那么,瀏覽器顯示的復選框時已勾選的。但是,Razor在值為False或者null時,會完全栓除該屬性標簽”。這句話的意思是說,如果在Razor中checked被賦值為False、null或者空字符串時,瀏覽器會直接渲染成已勾選狀態。而如果使用的是類似於上面ViewBag這種需要Razor求值的狀況,就會自動把False、null和空字符串刪掉這樣就不會有勾選狀態了。
附上在爆棧網上的提問。關於checked的詳細看回答者。