Gewusst wie: Erstellen von vorlagenbasierten ASP.NET-Benutzersteuerelementen
Aktualisiert: November 2007
Sie können Benutzersteuerelemente erstellen, die Vorlagen implementieren. Dieses ASP.NET-Feature gestattet die Trennung zwischen den Steuerelementdaten und ihrer Darstellung. Ein vorlagenbasiertes Steuerelement stellt keine Benutzeroberfläche bereit. Vielmehr dient es der Implementierung eines Benennungscontainers und der Aufnahme einer Klasse, deren Eigenschaften und Methoden der Hostseite zur Verfügung stehen.
Die Benutzeroberfläche für das Benutzersteuerelement wird zur Entwurfszeit von einem Seitenentwickler bereitgestellt. Bei der Erstellung der Vorlagen richtet sich der Entwickler nach dem Typ, der durch das Benutzersteuerelement definiert ist. Anschließend kann er den Vorlagen Steuerelemente und Markup hinzufügen.
So erstellen Sie ein Benutzersteuerelement mit Vorlagen
Fügen Sie der ASCX-Datei ein PlaceHolder-Steuerelement von ASP.NET dort hinzu, wo die Vorlage angezeigt werden soll.
Implementieren Sie im Code des Benutzersteuerelements eine Eigenschaft vom Typ ITemplate.
Definieren Sie eine Serversteuerelementklasse, die die INamingContainer-Schnittstelle als Container für das Erstellen einer Vorlageninstanz implementiert. Dieser wird als Benennungscontainer der Vorlage bezeichnet.
Hinweis: Im Grunde genommen wird das Steuerelement zu einer geschachtelten Klasse des Benutzersteuerelements, obwohl dies eigentlich nicht erforderlich wäre.
Wenden Sie TemplateContainerAttribute auf die Eigenschaft an, die ITemplate implementiert, und übergeben Sie den Typ des Benennungscontainers der Vorlage als Argument an den Attributkonstruktor.
Wiederholen Sie in der Init-Methode des Steuerelements die folgenden Schritte so oft wie nötig:
Erstellen Sie eine Instanz der Benennungscontainerklasse.
Erstellen Sie eine Instanz der Vorlage im Benennungscontainer.
Fügen Sie der Controls-Eigenschaft des PlaceHolder-Serversteuerelements die Instanz des Benennungscontainers hinzu.
Hinweis: Für die Seite, die das Benutzersteuerelement verwendet, ist die Syntax des vorlagenbasierten Benutzersteuerelements identisch mit der Syntax eines benutzerdefinierten vorlagenbasierten Steuerelements.
Beispiel
Das folgende Beispiel zeigt ein vorlagenbasiertes Benutzersteuerelement und eine Seite, die das Benutzersteuerelement enthält. Das Benutzersteuerelement erstellt eine Vorlage, die auf einer Hostseite als <MessageTemplate> deklariert werden kann. Das vorlagenbasierte Steuerelement macht außerdem die Eigenschaften Index und Message verfügbar, auf die die Hostseite innerhalb der Vorlage zugreifen kann.
Das erste Beispiel zeigt das vorlagenbasierte Benutzersteuerelement. Das zweite Beispiel zeigt eine Seite, die das Benutzersteuerelement enthält.
<%@ 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>