Compartir a través de


Crear un control de usuario basado en plantilla

Puede crear controles de usuario que implementen plantillas, una característica de ASP.NET que permite separar los datos del control de su presentación. Los controles basados en plantilla no proporcionan una interfaz de usuario (IU). La interfaz de usuario del control la proporciona un programador de páginas mediante plantillas en pantalla, que permiten al programador personalizar la interfaz de usuario del control. La creación de controles de usuario basados en plantillas le permitirán agregar controles de usuario a las páginas de su aplicación con facilidad, sin tener que compilar un control personalizado en un archivo .dll.

Para obtener más información sobre cómo crear un control con plantilla, vea Desarrollar un control con plantillas.

Para crear un control de usuario

  1. Cree de forma declarativa un control de servidor Web Placeholder ASP.NET en el archivo .ascx.

  2. Implemente una propiedad de tipo ITemplate en el bloque de declaración de código del control o clase de código subyacente.

  3. Defina, en el mismo bloque de código, un control de servidor que implemente INamingContainer como contenedor en el que crear una instancia de la plantilla. Éste se denomina contenedor de nomenclatura de la plantilla.

    Nota   Este control se convierte básicamente en una clase anidada del control de usuario, aunque esto no es necesario.

  4. Aplique TemplateContainerAttribute a la propiedad ITemplate y pase el tipo del contenedor de nomenclatura de la plantilla como argumento del constructor o del atributo.

  5. En el método Page_Init, repita los siguientes pasos una o más veces:

    • Cree una instancia de la clase del contenedor de nomenclatura.

    • Cree una instancia de la plantilla en el contenedor de nomenclatura.

    • Agregue la instancia del contenedor de nomenclatura a la propiedad Controls del control de servidor PlaceHolder.

      Nota  ** **Desde el punto de vista de la página que utiliza el control de usuario, la sintaxis del control de usuario con plantilla es idéntica a cómo sería con un control personalizado con plantilla.

El ejemplo siguiente demuestra un control de usuario con plantilla y una página que lo contiene.

Nota Este ejemplo expone solamente una propiedad de plantilla, pero se pueden exponer tantas propiedades de plantilla como sea necesario para que la aplicación funcione correctamente.

El control de usuario con plantilla:

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

La página ASP.NET que contiene el control de usuario con plantilla:

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

Vea también

Introducción a los controles de usuario de formularios Web Forms | Modelo de código de formularios Web Forms | Incluir un control de usuario en una página de formularios Web Forms | @ Control | UserControl