Erstellen eines Benutzersteuerelements mit Vorlagen
Ein weiteres Feature von ASP.NET ist die Möglichkeit, Benutzersteuerelemente zu erstellen, die Vorlagen implementieren (dies gestattet die Trennung zwischen der Darstellung und der Steuerung der Daten). Ein mit Vorlagen erstelltes Steuerelement stellt keine Benutzeroberfläche bereit. Vielmehr wird die Benutzeroberfläche für das Steuerelement vom Entwickler durch Inlinevorlagen verfügbar gemacht. Dadurch lässt sich bei der Entwicklung die Benutzeroberfläche des Steuerelements nach Bedarf gestalten. Das Erstellen von Benutzersteuerelementen mit Vorlagen vereinfacht deren Integration in die Seiten einer Anwendung, da die Kompilierung in eine DLL-Datei dabei entfällt.
Weitere Informationen zum Erstellen von Benutzersteuerelementen mit Vorlagen finden Sie unter Entwickeln eines Steuerelements mit Vorlagen.
So erstellen Sie ein Benutzersteuerelement mit Vorlagen
Erstellen Sie in der ASCX-Datei deklarativ ein ASP.NET-Placeholder-Webserversteuerelement, in das die Vorlage integriert werden soll.
Implementieren Sie im Codedeklarationsblock bzw. in der CodeBehind-Klasse des Benutzersteuerelements eine Eigenschaft vom Typ ITemplate.
Definieren Sie in demselben Codeblock ein Serversteuerelement, das "INamingContainer" als Container implementiert, in dem eine Instanz der Vorlage erstellt wird. Dieser wird als Benennungscontainer der Vorlage bezeichnet.
Hinweis Dieses Steuerelement wird prinzipiell zu einer verschachtelten Klasse des Benutzersteuerelements, obwohl dies nicht notwenig ist.
Wenden Sie das TemplateContainerAttribute-Attribut auf die ITemplate-Eigenschaft an, und übergeben Sie den Typ des Benennungscontainers der Vorlage als Argument an den Konstruktor bzw. das Attribut.
Wiederholen Sie in der Page_Init-Methode die folgenden Schritte ein- oder mehrmals:
Erstellen Sie eine Instanz der Benennungscontainerklasse.
Erstellen Sie eine Instanz der Vorlage im Benennungscontainer.
Fügen Sie die Instanz des Benennungscontainers zur Controls-Eigenschaft des PlaceHolder-Serversteuerelements hinzu.
Hinweis ** **Für die Seite, die das Benutzersteuerelement verwenden soll, ist die Syntax des vorlagenbasierten Benutzersteuerelements identisch mit der Syntax für ein benutzerdefiniertes, mit Vorlagen erstelltes Steuerelement.
Im folgenden Beispiel werden ein vorlagenbasiertes Benutzersteuerelement und eine Seite, die dieses Steuerelement enthält, gezeigt.
Hinweis In diesem Beispiel wird nur eine Vorlageneigenschaft zur Verfügung gestellt. Es können jedoch so viele Vorlageneigenschaften verfügbar gemacht werden, wie für das ordnungsgemäße Funktionieren der Anwendung erforderlich.
Das Steuerelement mit Vorlage:
<%@ 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>
Die ASP.NET-Seite, die das Benutzersteuerelement mit Vorlage enthält:
<%@ 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>
Siehe auch
Einführung in Benutzersteuerelemente für Web Forms User | Web Forms-Codemodell | Verwenden eines Benutzersteuerelements in einer Web Forms-Seite | @ Control | UserControl