Freigeben über


Entwickeln eines Steuerelements mit Vorlagen

Die Vorlagen in ASP.NET stellen ein vielseitiges Feature dar, das eine Trennung zwischen der Wiedergabe und den Daten eines Objekts ermöglicht. Ein über Vorlagen realisiertes Steuerelement stellt die Benutzeroberfläche (UI, User Interface) nicht selbst bereit. Vielmehr wird die UI für das Steuerelement vom Entwickler durch Inlinevorlagen bereitgestellt. Dadurch erhält der Entwickler die Möglichkeit, die UI des Steuerelements nach Bedarf zu gestalten. Wenn Sie keine Erfahrung im Umgang mit Vorlagen in ASP.NET haben, lesen Sie das Beispiel unter Schnelleinstieg zu ASP.NET —> ASP.NET Web Forms —> Datenzugriff und Anpassung —> Einführung in auf Vorlagen basierende Steuerelemente.

So entwickeln Sie ein über Vorlagen realisiertes Steuerelement

  1. Implementieren der System.Web.UI.InamingContainer-Schnittstelle. Dies ist eine Markierungsschnittstelle, die über keine Methoden verfügt. Sie erstellt einen neuen Gültigkeitsbereich für Namen unter diesem Steuerelement, damit die untergeordneten Steuerelemente in der Namensstruktur eindeutige Bezeichner erhalten.

    public class TemplatedFirstControl : Control,INamingContainer 
    {...}
    
  2. Wenden Sie ParseChildrenAttribute auf das Steuerelement an, und übergeben Sie als Argument true. Dadurch wird dem Seitenparser vermittelt, wie die Eigenschaftstags der Vorlage interpretiert werden sollen, wenn das Steuerelement deklarativ auf einer ASP.NET-Seite verwendet wird. Schritt 3 zeigt, wie Vorlageneigenschaften definiert werden.

    Hinweis   Wenn das Steuerelement von WebControl abgeleitet wird, müssen Sie ParseChildrenAttribute nicht anwenden, da WebControl bereits mit diesem Attribut gekennzeichnet ist.

    [ ParseChildren(ChildrenAsProperties = true)]
    public class TemplatedFirstControl : Control, INamingContainer {...}
    

    Weitere Informationen zu ParseChildrenAttribute finden Sie unter Verwenden des ParseChildrenAttribute.

  3. Definieren Sie eine oder mehrere Eigenschaften vom Typ System.Web.UI.ITemplate. ITemplate verfügt über die InstantiateIn-Methode, die mit Hilfe der auf der Seite bereitgestellten Inlinevorlage Steuerelemente erzeugt. Die InstantiateIn-Methode muss nicht eigens implementiert werden, da dies durch das ASP.NET-Seitenframework vorgenommen wird. Eine Itemplate-Eigenschaft muss über ein Metadatenattribut vom Typ System.Web.UI.TemplateContainerAttribute verfügen, das angibt, welches InamingContainer-Steuerelement die instanziierte Vorlage enthalten soll. Dieser Vorgang wird in Schritt 4 erläutert. Durch das folgende Codefragment wird eine Vorlageneigenschaft definiert.

    [TemplateContainer(typeof(FirstTemplateContainer))]                 
     public ITemplate FirstTemplate {...}
    
  4. Das Argument von TemplateContainerAttribute bestimmt den Typ des Containersteuerelements, in dem die Vorlage instanziiert werden soll. Das Containersteuerelement ist unabhängig von dem über eine Vorlage realisierten Steuerelement, das Sie verfassen. Ein logischer Container ist deshalb vorhanden, weil über Vorlagen realisierte Steuerelemente häufig eine Vorlage enthalten, die wiederholt mit unterschiedlichen Daten instanziiert werden muss. Ein Containersteuerelement, das sich vom Stamm-Vorlagensteuerelement unterscheidet, ermöglicht das gleichzeitige Vorhandensein solcher Instanzen. Der logische Container ist der direkte INamingContainer der untergeordneten Steuerelemente innerhalb der Vorlage. Nähere Erläuterungen zu dieser Beziehung finden Sie unter Entwickeln eines datengebundenen Steuerelements mit Vorlagen.

    Hinweis   INamingContainer muss direkt vom Containersteuerelement implementiert werden, da dieses untergeordnete Steuerelemente enthält, denen eindeutige Namen auf der Seite zugewiesen werden müssen.

    public class FirstTemplateContainer : Control, INamingContainer {...}
    
  5. Überschreiben Sie die CreateChildControls-Methode, um die untergeordneten Steuerelemente der Vorlage zu erstellen. Hierfür sind die folgenden drei Schritte notwendig:

    1. Instanziieren Sie den Vorlagencontainer.
    2. Rufen Sie die InstantiateIn-Methode der Vorlageneigenschaft auf, und übergeben Sie als Argument den Container. Die InstantiateIn-Methode (die in der Itemplate-Schnittstelle deklariert wird) instanziiert die Elemente der Vorlage als untergeordnete Steuerelemente des Vorlagencontainers. Die InstantiateIn-Methode muss nicht eigens implementiert werden, da dies durch das ASP.NET-Seitenframework vorgenommen wird.
    3. Fügen Sie der Controls-Auflistung Ihres über Vorlagen realisierten Steuerelements die Instanz des Vorlagencontainers hinzu.

    Im folgenden Codefragment wird eine Implementierung von CreateChildControls gezeigt.

    private Control myTemplateContainer;
    
    protected override void CreateChildControls ()          
    {
       if (FirstTemplate != null)
       {
          myTemplateContainer = new FirstTemplateContainer(this);
             FirstTemplate.InstantiateIn(myTemplateContainer);
          Controls.Add(myTemplateContainer);
        }
        else
        {
            Controls.Add(new LiteralControl(Text + " " + DateTime));
        }
     }
    
    
  6. Überschreiben Sie die von Control geerbte OnDataBinding-Methode, um die EnsureChildControls-Methode aufzurufen. Dadurch wird sichergestellt, dass in der Vorlage untergeordnete Steuerelemente erstellt werden, bevor das Seitenframework versucht, Datenbindungsausdrücke innerhalb der Vorlage auszuwerten. Außerdem müssen Sie die OnDataBinding-Methode der Basisklasse aufrufen, damit registrierte Ereignishandler aufgerufen werden.

            protected override void OnDataBinding(EventArgs e) {
                EnsureChildControls();
                base.OnDataBinding(e);
            }
    
  7. Führen Sie in Schritt 5 die Logik innerhalb der CreateChildControls-Methode so oft aus, bis Sie für jede Vorlageneigenschaft des Steuerelements eine Vorlage instanziiert haben.

Beispiele für ein über Vorlagen realisiertes Steuerelement, ein zugeordnetes Containersteuerelement für die Vorlage und eine Seite, auf der dieses Steuerelement eingesetzt wird, finden Sie unter Beispiel für ein Steuerelement mit Vorlagen.

Siehe auch

Beispiel für ein Steuerelement mit Vorlagen