開發樣板化的控制項
ASP.NET 提供稱為樣板 (Template) 的多樣化功能,允許控制項資料與其表現分開。樣板化的控制項本身不提供使用者介面 (UI)。控制項的 UI 由網頁開發人員透過內嵌 (Inline) 樣板 (可以讓網頁開發人員自訂控制項的 UI) 來提供。如果您不熟悉 ASP.NET 中的樣板,請參閱 ASP.NET 快速入門 -> ASP.NET Web Form -> 資料存取和自訂 -> 樣板化的控制項簡介中的範例。
若要開發樣板化的控制項
實作 System.Web.UI.INamingContainer 介面。這是沒有任何方法的資料標記介面。它在您的控制項之下建立新命名範圍,以便子控制項在命名樹狀結構中擁有唯一識別碼。
public class TemplatedFirstControl : Control,INamingContainer {...}
套用 ParseChildrenAttribute 於您的控制項,並傳遞 true 為引數。這將會在宣告性使用您的控制項於 ASP.NET 網頁時,指示網頁剖析器 (Parser) 如何剖析樣板屬性標記 (Tag)。步驟 3 將示範如何定義樣板屬性。
注意 如果您的控制項要自 WebControl 衍生,您不需要套用 ParseChildrenAttribute,因為 WebControl 已經使用這個屬性 (Attribute) 來標記。
[ ParseChildren(ChildrenAsProperties = true)] public class TemplatedFirstControl : Control, INamingContainer {...}
如需 ParseChildrenAttribute 的詳細資訊,請參閱使用 ParseChildrenAttribute。
定義一個或多個型別 System.Web.UI.ITemplate 的屬性。ITemplate 具有方法 InstantiateIn,可在網頁上使用樣板提供的內嵌來建立控制項。您不一定要實作 InstantiateIn 方法;ASP.NET 網頁架構會提供實作。ITemplate 屬性必須具有型別為 System.Web.UI.TemplateContainerAttribute 的中繼資料 (Metadata) 屬性,以指示哪一個 INamingContainer 控制項將儲存執行個體化的樣板。這將在步驟 4 中解釋。下列程式碼片段定義樣板屬性。
[TemplateContainer(typeof(FirstTemplateContainer))] public ITemplate FirstTemplate {...}
TemplateContainerAttribute 的引數的型別為您想在其中執行個體化樣板的容器控制項。容器控制項不受您撰寫之樣板化的控制項影響。要具有邏輯容器的理由是,樣板化的控制項經常會有需要以各種資料來重複執行個體化的樣板。具有不同於根樣板化的控制項的容器控制項,使得擁有如此多個執行個體成為可能。邏輯容器是樣板內子控制項的中繼 INamingContainer。這個關係將在開發樣板化的資料繫結控制項中做更詳盡的解釋。
注意 容器控制項本身必須實作 INamingContainer,因為它具有需要在網頁上被唯一命名的子控制項。
public class FirstTemplateContainer : Control, INamingContainer {...}
覆寫 CreateChildControls 方法來建立樣板中的子控制項。這以三個步驟來完成。
- 執行個體化樣板容器。
- 叫用 (Invoke) 樣板屬性的 InstantiateIn 方法,並將容器當作引數傳遞給它。InstantiateIn 方法 (在 ITemplate 介面中宣告) 將樣板的項目執行個體化為樣板容器的子控制項。您不一定要實作 InstantiateIn 方法;ASP.NET 網頁架構會提供實作。
- 加入樣板容器的執行個體至您樣板化的控制項之 Controls 集合。
下列程式碼片段示範 CreateChildControls 的實作。
private Control myTemplateContainer; protected override void CreateChildControls () { if (FirstTemplate != null) { myTemplateContainer = new FirstTemplateContainer(this); FirstTemplate.InstantiateIn(myTemplateContainer); Controls.Add(myTemplateContainer); } else { Controls.Add(new LiteralControl(Text + " " + DateTime)); } }
覆寫繼承自 Control 的 OnDataBinding 方法來叫用 EnsureChildControls 方法。這保證樣板的子控制項會在網頁架構嘗試評估樣板內的任何資料繫結運算式之前被建立。您也必須呼叫基底類別 (Base Class) 的 OnDataBinding 方法,確保註冊的事件處理常式會被叫用。
protected override void OnDataBinding(EventArgs e) { EnsureChildControls(); base.OnDataBinding(e); }
在步驟 5 中,重複 CreateChildControls 方法內的邏輯,為您控制項的每一個樣板屬性來執行個體化樣板。
如需樣板化的控制項、樣板相關容器控制項和使用控制項的網頁的範例,請參閱樣板化的控制項範例。