2009年12月14日 星期一

MasterPage中的ClientID

MasterPage會去惡搞Control的ClientID,這會在寫JavaScript時造成一些困擾...
套用MasterPage的話,網頁裡的元件的ClientID會被MasterPage惡搞,例如TextBox1變成 ctl00_ContentPlaceHolder1_TextBox1之類的。
原本想把義大利麵拿出來用,像這樣。
alert(document.getElementById('<% =TextBox1.ClientID%>').value);
不過基於程式潔癖與個人美學,於是改用另一個辦法。
在ASP上,把Control的ClientID當作參數傳入javascript function,用document.getElementById(blah)來找Control。
function testfunction(ctlName){
 var ctl = document.getElementById(ctlName);
 //blahblah code...
}
而ASP的code behind的Page_Load事件裡再去設定 OnClientClick(),或用Attributes.Add()來動態加入client side事件。
Button1.OnClientClick = "testfunction('" + TextBox1.ClientID + "'); ";
//or
TextBox1.Attributes.Add("onblur", "testfunction('" + TextBox1.ClientID + "');");

可是這種作法,對javascript的寫作限制很大,有點蠢...Orz
不過今天撿到寶了 XD
查資料的時候無意間看到黑暗執行緒老大對這個問題的solution-
在Page_Load時動態產生一個尋找頁面control的function,用這個function來取代document.getElementById
原文:KB-MasterPage ClientID Issue

看了只能說如獲至寶,不禁雙腿一軟,跪了下來