如何:创建模板化的 ASP.NET 用户控件

本文发布于 15 年前,部分内容可能已经失去参考价值。

可以创建实现模板的用户控件,这是 ASP.NET 的一项功能,它允许将控件数据与其表示形式相分离。模板化控件不提供用户界面。编写它则是为了实现一个命名容器以及包含属性和方法可由宿主页访问的类。

用户控件的用户界面由页面开发人员在设计时提供。开发人员创建由用户控件定义的类型模板,然后可以向模板添加控件和标记。

创建模板用户控件

  1. 在 .ascx 文件中,添加要在其中显示模板的 ASP.NET PlaceHolder 控件。

  2. 在用户控件的代码中,实现 ITemplate 类型的属性。

  3. 将实现 INamingContainer 接口的服务器控件类定义为要在其中创建模板实例的容器。此容器叫做模板的命名容器。

    说明:

    此控件实质上成了用户控件的嵌套类,但这不是必需的。

  4. TemplateContainerAttribute 应用于实现 ITemplate 的属性 (property),并将模板命名容器的类型作为参数传递给属性 (attribute) 的构造函数。

  5. 在控件的 Init 方法中,将以下步骤重复一次或多次:

    • 创建命名容器类的一个实例。

    • 在命名容器中创建该模板的一个实例。

    • 将命名容器实例添加到 PlaceHolder 服务器控件的 Controls 属性。

      说明:

      从使用用户控件的页面的角度来看,模板化用户控件的语法与自定义模板化控件的语法相同。

下面的示例演示一个模板化用户控件和一个包含该控件的页面。该用户控件创建一个可在宿主页上声明为 <MessageTemplate> 的模板。该模板控件还公开两个可由宿主页在模板内访问的属性:IndexMessage

第一个示例显示模板化用户控件。第二个示例显示包含该用户控件的页面。

Visual Basic
<%@ 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" />
Visual Basic
<%@ 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 >
<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 >
<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>
转自 网络(如侵权请联系删除) 15 年前
云服务器 精选特惠
可能相关的内容