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

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

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

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

创建模板用户控件

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

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

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

    注意注意

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

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

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

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

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

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

      注意注意

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

示例

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

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

注意注意

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" />

      
      
  1. <%@ Control language="C#" ClassName="TemplatedUC" %>
  2. <%@ Import Namespace="System.ComponentModel"  %>
  3. <script runat="server">
  4. private ITemplate messageTemplate = null;
  5.  
  6. [ TemplateContainer(typeof(MessageContainer)) ]
  7. [ PersistenceMode(PersistenceMode.InnerProperty) ]
  8. public ITemplate MessageTemplate {
  9.     get 
  10.     { 
  11.         return messageTemplate; 
  12.     }
  13.     set 
  14.     { 
  15.         messageTemplate = value; 
  16.     }
  17. }
  18.  
  19. void Page_Init() {
  20.     if (messageTemplate != null) {
  21.         String[] fruits = {"apple""orange""banana""pineapple" };
  22.         for (int i=0; i<4; i++) 
  23.         {
  24.             MessageContainer container = new MessageContainer(i, fruits[i]);
  25.             messageTemplate.InstantiateIn(container);
  26.             PlaceHolder1.Controls.Add(container);
  27.         }
  28.     }
  29. }
  30.  
  31. public class MessageContainer: Control, INamingContainer {
  32.     private int m_index;
  33.     private String m_message;
  34.     internal MessageContainer(int index, String message)
  35.     { 
  36.         m_index = index;
  37.         m_message = message;
  38.     }
  39.     public int Index {
  40.         get 
  41.         { 
  42.             return m_index; 
  43.         } 
  44.     }
  45.     public String Message 
  46.     { 
  47.         get 
  48.         { 
  49.             return m_message; 
  50.         } 
  51.     }
  52. }
  53. </script>
  54. <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>

      
      
  1. <%@ Page Language="C#" %>
  2. <%@ Register TagPrefix="uc" tagname="TemplateTest" 
  3.     Src="TemplatedUC.ascx" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  5.     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  6. <html xmlns="http://www.w3.org/1999/xhtml">
  7. <script runat="server">
  8.     protected void Page_Load()
  9.     {
  10.         DataBind();
  11.     }
  12.     
  13. </script>
  14. <head>
  15. <title>Templated User Control Test</title>
  16. </head>
  17. <body>
  18. <h1>Testing Templated User Control</h1>
  19. <form id="Form1" runat="server">
  20. <uc:TemplateTest runat="server">
  21.   <MessageTemplate>
  22.     Index: <asp:Label runat="server" ID="Label1" 
  23.         Text='<%# Container.Index %>' />
  24.     <br />
  25.     Message: <asp:Label runat="server" ID="Label2" 
  26.         Text='<%# Container.Message %>' />
  27.     <hr />
  28.   </MessageTemplate>
  29. </uc:TemplateTest>
  30. </form>
  31. </body>
  32. </html>
古道网络:http://www.rzgd.cn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值