可以创建实现模板的用户控件,这是 ASP.NET 的一项功能,它允许将控件数据与其表示形式相分离。 模板化控件不提供用户界面。 编写它则是为了实现一个命名容器以及包含属性和方法可由宿主页访问的类。 有关更多信息,请参见模板集和模板化控件。
用户控件的用户界面由页面开发人员在设计时提供。 开发人员创建由用户控件定义的类型模板,然后可以向模板添加控件和标记。
创建模板用户控件
示例
下面的示例演示一个模板化用户控件和一个包含该控件的页面。 该用户控件创建一个可在宿主页上声明为<MessageTemplate>的模板。 该模板控件还公开两个可由宿主页在模板内访问的属性:Index和Message。
第一个示例显示模板化用户控件。 第二个示例显示包含该用户控件的页面。
注意 |
---|
Visual Studio 设计器不支持模板化的 ASP.NET 用户控件。 但可以在 Visual Studio 中编译并运行该示例。 为此,在创建 ASP.NET 页以测试此代码时,会将页中的所有由设计器生成的代码替换为示例列表中的代码和标记。 |
<%@ 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>