KB-MasterPage ClientID Search Enhancement
先前曾提出在MasterPage中解決ClientID被加料的方法,最近發現原來的做法有些小缺點。
原先的邏輯只額外多搜尋ContentPlaceHolder的字頭(Prefix),但是若其中有UserControl,則UserControl的ClientID還會被加上UserControl的ID。例如: (UC11中只有一個TextBox1)
<asp:Content ID="Content2" ContentPlaceHolderID="Editor" Runat="Server">
<uc1:UC1 ID="UC11" runat="server" />
</asp:Content>
實際的TextBox1的ClientID會變成ctl00_Editor_UC11_TextBox1,原先的做法只會Search到ctl00_Editor_TextBox1,因此UserControl下的物件就變成化外之民。
<input name="ctl00$Editor$UC11$TextBox1" type="text" id="ctl00_Editor_UC11_TextBox1" />
我修改了原有的程式,將UserControl的ClientID也加入要搜索的字頭之一,同時對ContentPlaceHolder下的Control也要逐一巡迴檢查,這樣就能把UserControl下的物件納入afa_mpget的查找範圍內。
public static void searchContentPlaceHolder(Control ctrl, List<string> lst)
{
if (ctrl is ContentPlaceHolder || ctrl is UserControl)
lst.Add(ctrl.ClientID);
if (ctrl.HasControls())
{
foreach (Control c in ctrl.Controls)
searchContentPlaceHolder(c, lst);
}
}
只是,原先與網友大估討論過將邏輯放在Page_Init解決對ViewState干擾的做法,由於在搜尋的時候必須確認網頁上的Control物件都已Create妥當,以免在列舉時有遺珠,因此放在Page_Load()比較OK。最終決定的做法: 放在Page_Load()+Page.Header.Controls.Add(...)。