Поделиться через


Практическое руководство. Создание пользовательских элементов управления-шаблонов ASP.NET

Обновлен: Ноябрь 2007

Пользовательские элементы управления могут быть реализованы на основе шаблонов. Шаблон — это средство ASP.NET, позволяющее отделить данные элемента управления от их представления. Элемент управления-шаблон сам по себе не реализует интерфейс пользователя. Вместо этого он записывается для реализации контейнера именования и для включения класса, свойства и методы которого доступны на главной странице.

Пользовательский интерфейс для пользовательского элемента управления предоставляется разработчиком страницы во время разработки. Разработчик создает шаблоны типа, определяемого пользовательским элементом управления, и может затем добавить элементы управления и разметки в шаблоны.

Создание пользовательского элемента управления-шаблона

  1. В ASCX-файле добавьте элемент управления PlaceHolder ASP.NET, в котором будет находиться шаблон.

  2. В коде пользовательского элемента управления реализуйте свойство типа ITemplate.

  3. Определите класс элементов управления сервера, реализующий интерфейс INamingContainer в качестве контейнера, в котором требуется создать экземпляр шаблона. Такой контейнер называется контейнером именования шаблона.

    36574bf6.alert_note(ru-ru,VS.90).gifПримечание.

    Этот элемент управления в основном становится вложенным классом пользовательского элемента управления, хотя это не обязательно.

  4. Примените TemplateContainerAttribute к свойству, которое реализует ITemplate, и передайте тип контейнера именования шаблона в качестве аргумента в конструктор атрибута.

  5. В методе Init элемента управления повторите следующие шаги один или несколько раз:

    • Создайте экземпляр класса контейнера именования.

    • Создайте экземпляр шаблона в этом контейнере именования.

    • Добавьте экземпляр контейнера именования в свойство Controls серверного элемента управления PlaceHolder.

      36574bf6.alert_note(ru-ru,VS.90).gifПримечание.

      С точки зрения страницы, применяющей этот пользовательский элемент управления, синтаксис пользовательского элемента управления-шаблона аналогичен синтаксису настраиваемого элемента управления-шаблона.

Пример

В следующем примере показан пользовательский элемент управления-шаблон и содержащая его страница. Пользовательский элемент управления создает шаблон, который может быть объявлен на странице узла в качестве <MessageTemplate>. Элемент управления-шаблон также предоставляет два свойства, Index и Message, к которым страница узла имеет доступ внутри шаблона.

В первом примере показан пользовательский элемент управления-шаблон. Во втором пример показана страница, которая содержит этот пользовательский элемент управления.

<%@ Control language="VB" ClassName="TemplatedUC" %>
<%@ Import Namespace="System.ComponentModel"  %>

<script runat="server" >
    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 runat="server" ID="PlaceHolder1" />
<%@ Control language="C#" ClassName="TemplatedUC" %>
<%@ Import Namespace="System.ComponentModel"  %>
<script runat="server">
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 runat="server" 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 runat="server">
    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" runat="server">
<uc:TemplateTest runat="server">
  <MessageTemplate>
    Index: <asp:Label runat="server" ID="Label1" 
                Text='<%# Container.Index %>' />
    <br />
    Message: <asp:Label runat="server" 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 runat="server">
    protected void Page_Load()
    {
        DataBind();
    }
    
</script>
<head>
<title>Templated User Control Test</title>
</head>
<body>
<h1>Testing Templated User Control</h1>
<form id="Form1" runat="server">
<uc:TemplateTest runat="server">
  <MessageTemplate>
    Index: <asp:Label runat="server" ID="Label1" 
        Text='<%# Container.Index %>' />
    <br />
    Message: <asp:Label runat="server" ID="Label2" 
        Text='<%# Container.Message %>' />
    <hr />
  </MessageTemplate>
</uc:TemplateTest>
</form>
</body>
</html>

См. также

Основные понятия

Общие сведения о пользовательских элементах управления ASP.NET