ASP.NET 4.0新增的ClientIDMode是一項重大的更新,不知這是什 的話,可以在這裡看看。 預設ClientIDMode是Inherit 不過我想大多數人都會把焦點放在ClientIDMode=”Static”。
由於預設是Inherit,ClientIDMode會以預設的AutoID去制定Controls ID,或者有人會直接在Page Detective把ClientIDMode設定為”Static”供ClientIDMode去Inherit。
<%@Page ClientIDMode="Static"%>
那就不用每個WebControl都設定一次,但問題就來了,部份Third Party的WebControls未必能可以在Static ID下運作,特別是需要ClientScript做CallBack的,可能會找不到Render HTML後的ID。 目前至少AjaxControltoolKit中的AsyncFileUpload已經要設定ClientIDMode=”AutoID”才能正確運作。
而值得看看的是Predictable Mode,Predictable 主要是給Data Control使用,例如Repeater,DataList這些會重複Generate HTML Element的WebControls。 因為當你制定ItemTemplate時,你不可能期望每一項Item中的Controls ID都相同,同樣亦不合理,例如Repeater:
<tr>
<td>
<span id="mySpan">Row1</span>
</td>
</tr>
<tr>
<td>
<span id="mySpan">Row2</span>
</td>
</tr>
所以”Predictable”的出現就是給你設定ClientIDRowSuffix property,自行制定。其實我會建議在DataControl中ItemTemplate或EditTemplate下,所有Web Control都加上ClientIDMode為AutoID或者Predictable,即使設成AutoID感覺上很多餘,但基於有override的可能性,都是加上好一點。
或者ASP.NET老手已經深明這些道理,但剛學ASP.NET的話,亦無需要太追求簡短的ID,這類型ID,”ctl00_ContentPlaceHolder1_HideProductImage”,我們都習慣了。