Creazione di un controllo utente basato su template

È possibile creare controlli utente che implementano template, una funzionalità di ASP.NET che consente la separazione dei dati del controllo dalla relativa presentazione. Un controllo basato su template non fornisce un'interfaccia utente. L'interfaccia utente per il controllo viene fornita dagli sviluppatori di pagine tramite template inline, che consentono agli sviluppatori di personalizzare l'interfaccia utente per il controllo. La creazione di controlli utente basati su template consente di aggiungere controlli utente alle pagine dell'applicazione senza compilare controlli personalizzati in un file DLL.

Per ulteriori informazioni sulla creazione di controlli personalizzati basati su template, vedere Sviluppo di un controllo basato su template.

Per creare un controllo utente basato su template

  1. Nel file ASCX creare in modo dichiarativo il controllo server Web ASP.NET Placeholder in cui si desidera che venga visualizzato il template.

  2. Nel blocco della dichiarazione del codice o nella classe di codice sottostante del controllo utente implementare una proprietà di tipo ITemplate.

  3. Nello stesso blocco di codice, definire un controllo server che implementa INamingContainer come contenitore in cui creare un'istanza del template. Tale contenitore viene definito contenitore di denominazione del template.

    Nota   Questo controllo diventa essenzialmente una classe nidificata del controllo utente, anche se tale trasformazione non è obbligatoria.

  4. Applicare l'attributo TemplateContainerAttribute alla proprietà ITemplate e passare il tipo del contenitore di denominazione del template come argomento al costruttore dell'attributo.

  5. Nel metodo Page_Init ripetere una o più volte i passaggi seguenti:

    • Creare un'istanza della classe del contenitore di denominazione.

    • Creare un'istanza del template nel contenitore di denominazione.

    • Aggiungere l'istanza del contenitore di denominazione alla proprietà Controls del controllo server PlaceHolder.

      Nota  ** **Dal punto di vista della pagina che utilizza il controllo utente, la sintassi per il controllo utente basato su template è identica a quella di un controllo personalizzato basato su template.

Nell'esempio seguente vengono riportati un controllo utente basato su template e la pagina che lo contiene.

Nota   Nell'esempio viene esposta solo una proprietà di template, ma è possibile esporre tutte le proprietà di template necessarie per il corretto funzionamento dell'applicazione.

Controllo utente basato su template:

<%@ 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>

Pagina ASP.NET contenente il controllo utente basato su template:

<%@ 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>

Vedere anche

Introduzione ai controlli utente Web Form | Modello di codice di Web Form | Inclusione di un controllo utente in una pagina Web Form | @ Control | UserControl