建立樣板化的使用者控制項
您可以建立實作樣板的使用者控制項 (這是 ASP.NET 的一項功能,可將控制項資料與它的展示分開來)。樣板化的控制項不提供使用者介面 (UI)。控制項的 UI 是由網頁開發人員透過內嵌 (Inline) 樣板來提供,可讓網頁開發人員自訂控制項的 UI。建立樣板化的使用者控制項,可讓您在應用程式中輕鬆地將使用者控制項加入網頁中,而不必將自訂控制項編譯成 .dll 檔案。
如需建立自訂樣板化控制項的詳細資訊,請參閱開發樣板化的控制項。
若要建立樣板化的使用者控制項
在 .ascx 檔案中樣板出現的位置,以宣告方式建立 ASP.NET Placeholder Web 伺服器控制項。
在使用者控制項的程式碼宣告區塊或程式碼後置類別中,實作 ITemplate 型別的屬性。
在相同的程式碼區塊中,定義一個伺服器控制項,將 INamingContainer 實作為一容器,而在該容器中可建立樣板的執行個體。這個就稱為樣板的命名容器。
**注意 **這個控制項最後一定會變成使用者控制項的巢狀類別 (Nested Class),雖然這並不是必要項。
將 TemplateContainerAttribute 套用至 ITemplate 屬性,並將樣板的命名容器型別當作引數,傳遞至建構函式 (Constructor) 或屬性。
在 Page_Init 方法中,重複下列步驟一次或多次:
建立命名容器類別的執行個體。
在命名容器中建立樣板的執行個體。
將命名容器執行個體加入至 PlaceHolder 伺服器控制項的 Controls 屬性中。
**注意 **從使用使用者控制項的網頁觀點來看,樣板化使用者控制項的語法與自訂樣板化控制項的語法完全相同。
下列範例示範樣板化的使用者控制項以及包含它的網頁。
**注意 **這個範例只會公開一個樣板屬性,但是您可以依照應用程式正常執行時所需,公開多個樣板屬性。
樣板化使用者控制項:
<%@ Control language="VB" debug="True" %>
<script runat="server" >
Private messageTemplate As ITemplate = Nothing
<TemplateContainer(GetType(MessageContainer))>Public Property MessageTemplate() As ITemplate
Get
Return messageTemplate
End Get
Set
messageTemplate = value
End Set
End Property
Sub Page_Init()
If Not (messageTemplate Is Nothing) Then
Dim i As Integer
For i = 0 To 4
Dim container As New MessageContainer(i)
messageTemplate.InstantiateIn(container)
msgholder.Controls.Add(container)
Next i
End If
End Sub 'Page_Init
Public Class MessageContainer
Inherits Control
Implements INamingContainer
Private index As Integer
Friend Sub New(index As Integer)
Me.index = index
End Sub 'New
Public ReadOnly Property Index() As Integer
Get
Return index
End Get
End Property
End Class 'MessageContainer
</script>
<hr>
<asp:placeholder runat=server id=msgholder/>
<hr>
[C#]
<%@ Control language=c# debug=true %>
<script runat=server>
private ITemplate messageTemplate = null;
[ TemplateContainer(typeof(MessageContainer)) ]
public ITemplate MessageTemplate {
get { return messageTemplate; }
set { messageTemplate = value; }
}
void Page_Init() {
if (messageTemplate != null) {
for (int i=0; i<5; i++) {
MessageContainer container = new MessageContainer(i);
messageTemplate.InstantiateIn(container);
msgholder.Controls.Add(container);
}
}
}
public class MessageContainer: Control, INamingContainer {
private int index;
internal MessageContainer(int index) { this.index = index; }
public int Index { get { return index; } }
}
</script>
<hr>
<asp:placeholder runat=server id=msgholder/>
<hr>
包含樣板化使用者控制項的 ASP.NET 網頁。
<%@ language=vb debug=true %>
<%@ Register TagPrefix="acme" tagname="test" src=TemplatedUserControl.ascx %>
<html>
<script runat=server>
Sub Page_Load()
DataBind()
End Sub 'Page_Load
</script>
<body>
' The Container in the data-binding syntax will automatically be of type
' MessageContainer, since the TemplateContainer attribute was applied
' to the ITemplate class in the .ascx file.
<form runat=server>
<acme:test runat=server>
<MessageTemplate>
Hello #<%# Container.Index %>.<br>
</MessageTemplate>
</acme:test>
</form>
</body>
</html>
[C#]
<%@ language=c# debug=true %>
<%@ Register TagPrefix="acme" tagname="test" src=TemplatedUserControl.ascx %>
<html>
<script runat=server>
void Page_Load() {
DataBind();
}
</script>
<body>
// The Container in the data-binding syntax will automatically be of type
// MessageContainer, since the TemplateContainer attribute was applied
// to the ITemplate class in the .ascx file.
<form runat=server>
<acme:test runat=server>
<MessageTemplate>
Hello #<%# Container.Index %>.<br>
</MessageTemplate>
</acme:test>
</form>
</body>
</html>
請參閱
Web Form 使用者控制項的簡介 | Web Form 程式碼模型 | 在 Web Form 網頁中包含使用者控制項 | @ Control | UserControl