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(...)。

Published 19 January 2008 10:53 AM 由 Jeffrey
Filed under: ,


意見

# 大估 said on 21 January, 2008 12:59 AM

感謝黑暗大大~

又學到東西了~

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 

請輸入以上的數字:

【請注意】意見送出後可能需要幾分鐘才會出現在網頁上,請耐心等候。

搜尋

Go

<January 2008>
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789
 
RSS
最新回應


BlogLook Score and Rank

Syndication