HOW TO:建立樣板化 ASP.NET 使用者控制項
更新:2007 年 11 月
您可以建立實作樣板的使用者控制項 (這是 ASP.NET 的一項功能,可將控制項資料與它的展示分開來)。樣板化的控制項不提供使用者介面。而是撰寫以便實作命名容器,以及包含能夠從主頁面存取屬性和方法的類別。
使用者控制項的使用者介面是由頁面開發人員在設計階段時提供。開發人員會建立使用者控制項定義的型別樣板,然後可以在樣板上加入控制項和標記。
建立樣板化的使用者控制項
在 .ascx 檔案中,在想要顯示樣板的位置上加入 ASP.NET PlaceHolder 控制項。
在使用者控制項的程式碼中,實作型別 ITemplate 的屬性。
定義實作 INamingContainer 介面當做容器的伺服器控制項類別,以建立樣板的執行個體。這個就稱為樣板的命名容器。
注意事項:
這個控制項最後一定會變成使用者控制項的巢狀類別,雖然這並不是必要項。
將 TemplateContainerAttribute 套用至實作 ITemplate 的屬性 (Property),並將樣板的命名容器型別當做引數,傳遞至屬性 (Attribute) 的建構函式。
在控制項的 Init 方法中,重複下列步驟一次或多次:
建立命名容器類別的執行個體。
在命名容器中建立樣板的執行個體。
將命名容器執行個體加入至 PlaceHolder 伺服器控制項的 Controls 屬性中。
注意事項:
從使用使用者控制項的網頁觀點來看,樣板化使用者控制項的語法與自訂樣板化控制項的語法完全相同。
範例
下列範例顯示樣板化的使用者控制項以及包含它的網頁。使用者控制項會建立可以在主網頁上當做 <MessageTemplate> 宣告的樣板。樣板控制項也會公開兩個屬性,Index 和 Message,主網頁可以在樣板內存取它們。
第一個範例顯示樣板化的使用者控制項。第二個範例顯示包含使用者控制項的網頁。
<%@ Control language="VB" ClassName="TemplatedUC" %>
<%@ Import Namespace="System.ComponentModel" %>
<script >
Private m_messageTemplate As ITemplate = Nothing
<TemplateContainer(GetType(MessageContainer))> _
<PersistenceMode(PersistenceMode.InnerProperty)> Public Property _
MessageTemplate() As ITemplate
Get
Return m_messageTemplate
End Get
Set(ByVal value As ITemplate)
m_messageTemplate = Value
End Set
End Property
Sub Page_Init()
If Not (MessageTemplate Is Nothing) Then
Dim i As Integer
Dim fruits() As String = _
{"apple", "orange", "banana", "pineapple"}
For i = 0 To 3
Dim container As New MessageContainer(i, fruits(i))
MessageTemplate.InstantiateIn(container)
PlaceHolder1.Controls.Add(container)
Next i
End If
End Sub
Public Class MessageContainer
Inherits Control
Implements INamingContainer
Private m_index As Integer
Private m_message As String
Friend Sub New(ByVal i As Integer, ByVal msg As String)
Me.Index = i
Me.Message = msg
End Sub
Public Property Index() As Integer
Get
Return m_index
End Get
Set(ByVal value As Integer)
m_index = value
End Set
End Property
Public Property Message() As String
Get
Return m_message
End Get
Set(ByVal value As String)
m_message = value
End Set
End Property
End Class
</script>
<asp:Placeholder ID="PlaceHolder1" />
<%@ Control language="C#" ClassName="TemplatedUC" %>
<%@ Import Namespace="System.ComponentModel" %>
<script >
private ITemplate messageTemplate = null;
[ TemplateContainer(typeof(MessageContainer)) ]
[ PersistenceMode(PersistenceMode.InnerProperty) ]
public ITemplate MessageTemplate {
get
{
return messageTemplate;
}
set
{
messageTemplate = value;
}
}
void Page_Init() {
if (messageTemplate != null) {
String[] fruits = {"apple", "orange", "banana", "pineapple" };
for (int i=0; i<4; i++)
{
MessageContainer container = new MessageContainer(i, fruits[i]);
messageTemplate.InstantiateIn(container);
PlaceHolder1.Controls.Add(container);
}
}
}
public class MessageContainer: Control, INamingContainer {
private int m_index;
private String m_message;
internal MessageContainer(int index, String message)
{
m_index = index;
m_message = message;
}
public int Index {
get
{
return m_index;
}
}
public String Message
{
get
{
return m_message;
}
}
}
</script>
<asp:Placeholder ID="PlaceHolder1" />
<%@ Page Language="VB" %>
<%@ Register TagPrefix="uc" tagname="TemplateTest"
Src="TemplatedUC.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script >
Sub Page_Load()
DataBind()
End Sub
</script>
<head>
<title>Templated User Control Test</title>
</head>
<body>
<h1>Testing Templated User Control</h1>
<form id="Form1" >
<uc:TemplateTest >
<MessageTemplate>
Index: <asp:Label ID="Label1"
Text='<%# Container.Index %>' />
<br />
Message: <asp:Label ID="Label2"
Text='<%# Container.Message %>' />
<hr />
</MessageTemplate>
</uc:TemplateTest>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<%@ Register TagPrefix="uc" tagname="TemplateTest"
Src="TemplatedUC.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script >
protected void Page_Load()
{
DataBind();
}
</script>
<head>
<title>Templated User Control Test</title>
</head>
<body>
<h1>Testing Templated User Control</h1>
<form id="Form1" >
<uc:TemplateTest >
<MessageTemplate>
Index: <asp:Label ID="Label1"
Text='<%# Container.Index %>' />
<br />
Message: <asp:Label ID="Label2"
Text='<%# Container.Message %>' />
<hr />
</MessageTemplate>
</uc:TemplateTest>
</form>
</body>
</html>