Web Form 控制項識別
更新:2007 年 11 月
每個 ASP.NET Web 網頁的控制項必須是可唯一識別的。一般來說,必須將值指派給控制項的 ID 屬性,以便唯一識別這個控制項。該值成為控制項的執行個體 (Instance) 名稱 - 也就是說,可用這個名稱在程式碼中參考控制項。例如,如果將 TextBox 控制項的 ID 屬性設為 Text1,就能在程式碼中以 Text1 參考控制項。
有一些資料繫結控制項,其中包含 DataList、Repeater、GridView、FormView 和 DetailsView 控制項,將扮演其他 (子系) 控制項的容器。當這些控制項執行時,會產生多個子控制項的執行個體。例如,如果建立其中包含 Label 控制項的 DataList 範本,當網頁執行時,網頁中 Label 控制項的執行個體數目,會與 DataList 控制項資料來源中的記錄數目一樣多。
![]() |
---|
使用範本的控制項 (例如 DataList 和 Repeater 控制項) 會裝載範本物件。例如,當 DataList 控制項執行時,會建立多個 DataListItem 類別的執行個體。這些樣板物件逐一包含個別的控制項,如標記、文字方塊、按鈕等等。 |
由於控制項可在同一個網頁上多次具現化,因此可在不同網頁中重新使用控制項。ASP.NET 網頁架構提供機制,確保網頁上和應用程式中的控制項具有唯一的識別項。它也提供尋找這些個別控制項的方法,如此您就能在自己的程式碼中加以管理。
命名容器
能像其他控制項的容器般作用的控制項,會為其子控制項產生命名容器,或是 ID 命名空間。藉由提供這項命名容器,控制項可確保在整個應用程式中,其子控制項的 ID 屬性是唯一的 (控制項會藉由實作 INamingContainer 介面產生命名容器)。在執行階段建立子控制項時,命名容器會與子控制項的 ID 屬性結合,建立每個子控制項的 UniqueID 屬性值。因此 UniqueID 屬性會成為控制項的完整識別項,參考其命名容器和控制項的個別 ID 值。
在上述範例中,Label 控制項的多個執行個體是在父 DataList 控制項的命名容器 (命名空間) 中建立的。每個 Label 控制項的 UniqueID 屬性將反映這個命名空間,其格式看起來會像 DataList1:_ctl:MyLabel、DataList1:_ct2:MyLabel 等。
![]() |
---|
撰寫程式碼時,請不要參考使用所產生 UniqueID 屬性值的控制項。您可以將 UniqueID 屬性視為控制代碼 (例如,藉由將其傳遞到處理序),但不應依賴它的特定結構。 |
除了每個容器控制項提供其子控制項的命名容器以外,網頁本身也會對所有它的子控制項提供命名容器。這樣就會在應用程式中為網頁上所有的控制項建立唯一的命名空間。
使用 NamingContainer 屬性
子控制項可透過 NamingContainer 屬性參考其命名容器。這個屬性會傳回 Control 型別的物件,可將它轉換成合適的 DataList 控制項、DataListItem 物件等。
在需要從子控制項存取容器控制項的屬性時,參考命名容器特別有用。例如,在子控制項 DataBinding 事件的處理常式中,可藉由從命名容器中取得 DataItem 物件加以存取。
![]() |
---|
NamingContainer 屬性不一定要與 Parent 屬性參考相同的控制項。例如,在 Repeater 控制項中,您可能會有包含資料表的項目範本,而資料表中又包含 Label 控制項。標記 (Label) 的父控制項是表格儲存格 (例如,HtmlTableCell 物件),但它的命名容器為 DataListItem 物件,因為是 DataListItem 定義 Label 控制項的命名空間,而不是資料表。 |
參考控制項
如果您的網頁含有在執行階段產生的控制項,例如 DataList、Repeater 或 GridView 控制項範本中的控制項,就無法使用其 ID 直接參考它們,因為 ID 並不是唯一的。然而,有幾個方法可以用來尋找網頁中的個別控制項。如需詳細資訊,請參閱以程式設計方式存取 ASP.NET 控制項。