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

  1. Fügen Sie der ASCX-Datei ein PlaceHolder-Steuerelement von ASP.NET dort hinzu, wo die Vorlage angezeigt werden soll.

  2. Implementieren Sie im Code des Benutzersteuerelements eine Eigenschaft vom Typ ITemplate.

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

  4. Wenden Sie TemplateContainerAttribute auf die Eigenschaft an, die ITemplate implementiert, und übergeben Sie den Typ des Benennungscontainers der Vorlage als Argument an den Attributkonstruktor.

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

Siehe auch

Konzepte

Übersicht über ASP.NET-Benutzersteuerelemente