星期五, 3月 28, 2008

MasterPage 遇到 clientID 的解決方法

當大家在用MasterPage時都有遇過很機車的問題..就是MasterPage會給妳亂加料..例如
id="Label1"就變成,id="ctl00_ContentPlaceHolder1_Label1"..這樣導致寫javascript時會
困擾抓不到id..網路上有解決的辦法..就是<% =TextBox1.ClientID%>把這寫在.aspx裡..
不過有時動態產生的control或是效能或是潔癖原因導致不能或是不想用這方法..所以自己就
很簡單的寫的一個class

public class masterPageHelp
{
//ContentPlaceHolder就你要處理clientId的地方
public void masterClientIdChange(MasterPage mr, string ContentPlaceHolder)
{
Page page = HttpContext.Current.CurrentHandler as Page;
Label lblTest = new Label();
lblTest.ID = "_";
mr.FindControl(ContentPlaceHolder).Controls.Add(lblTest);
page.ClientScript.RegisterStartupScript(GetType(), "msterpageClientChange", @"
function "
+ ContentPlaceHolder + @"(id)
{
return '"
+ lblTest.ClientID.Substring(0, lblTest.ClientID.Length - 1) + @"' + id;
}
"
, true);
}
}

上面原理就是把一個Label丟到ContentPlaceHolder裡..利用Label的去把MasterPage多加的
字串抓出來..之後在同一個ContentPlaceHolder的id就可以用這個javascript function去轉換..

用法:
在.cs的PageLoad裡加入就可以..然後在自己的javascript function裡就可以用

function test()
{
//ContentPlaceHolder就是妳放在哪個地方
var clientId = ContentPlaceHolder1(clientId);
document.getElementById(clientId).innerHtml = "test";
}

結論:
這只是我案子用到時的處理的方法..有需要的就拿去ㄅ..沒有很嚴謹的測試..有問題跟我說ㄟ..
一起討論一下^^

參考:
http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/12/21/1445.aspx
(上面黑暗大大也有解決方法..不過不知是不是我資質駑鈍..看不太懂..XD..)

沒有留言: