Практическое руководство. Создание пользовательских элементов управления-шаблонов ASP.NET
Обновлен: Ноябрь 2007
Пользовательские элементы управления могут быть реализованы на основе шаблонов. Шаблон — это средство ASP.NET, позволяющее отделить данные элемента управления от их представления. Элемент управления-шаблон сам по себе не реализует интерфейс пользователя. Вместо этого он записывается для реализации контейнера именования и для включения класса, свойства и методы которого доступны на главной странице.
Пользовательский интерфейс для пользовательского элемента управления предоставляется разработчиком страницы во время разработки. Разработчик создает шаблоны типа, определяемого пользовательским элементом управления, и может затем добавить элементы управления и разметки в шаблоны.
Создание пользовательского элемента управления-шаблона
В ASCX-файле добавьте элемент управления PlaceHolder ASP.NET, в котором будет находиться шаблон.
В коде пользовательского элемента управления реализуйте свойство типа ITemplate.
Определите класс элементов управления сервера, реализующий интерфейс INamingContainer в качестве контейнера, в котором требуется создать экземпляр шаблона. Такой контейнер называется контейнером именования шаблона.
Примечание.
Этот элемент управления в основном становится вложенным классом пользовательского элемента управления, хотя это не обязательно.
Примените TemplateContainerAttribute к свойству, которое реализует ITemplate, и передайте тип контейнера именования шаблона в качестве аргумента в конструктор атрибута.
В методе Init элемента управления повторите следующие шаги один или несколько раз:
Создайте экземпляр класса контейнера именования.
Создайте экземпляр шаблона в этом контейнере именования.
Добавьте экземпляр контейнера именования в свойство Controls серверного элемента управления PlaceHolder.
Примечание.
С точки зрения страницы, применяющей этот пользовательский элемент управления, синтаксис пользовательского элемента управления-шаблона аналогичен синтаксису настраиваемого элемента управления-шаблона.
Пример
В следующем примере показан пользовательский элемент управления-шаблон и содержащая его страница. Пользовательский элемент управления создает шаблон, который может быть объявлен на странице узла в качестве <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