Freigeben über


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

  1. Erstellen Sie in der ASCX-Datei deklarativ ein ASP.NET-Placeholder-Webserversteuerelement, in das die Vorlage integriert werden soll.

  2. Implementieren Sie im Codedeklarationsblock bzw. in der CodeBehind-Klasse des Benutzersteuerelements eine Eigenschaft vom Typ ITemplate.

  3. 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.

  4. 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.

  5. 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