与自定义控件的用户控件的概述

文章翻译 文章翻译
文章编号: 893667 - 查看本文应用于的产品
ASP.NET 支持语音列

与自定义控件的用户控件的概述

要自定义此列设置为您的需要,我们想要邀请您提交您的想法有关您和您想要查看的问题感兴趣的主题在将来解决知识文库文章和 Support Voice 专栏。您可以提交您的意见和反馈使用 诚征意见 表单。也是一个链接到该窗体,在此列的底部。
展开全部 | 关闭全部

本文内容

简介

您好 !这是 Parag,,我是支持工程师与 Microsoft ASP.NET 支持组工作超过一年的时间了。在加入 Microsoft 之前, 我处理的基于 Web 的项目和使用 Microsoft 技术的桌面应用程序。同时为客户提供高质量的支持,我看过其中时自定义控件,周围一些混乱,我只想花一些时间来解释自定义控件周围的一些概念的情况。为损坏像看上去那么相信我,一旦获得它的挂起时,将处于更有利的位置非常感谢 ASP.NET。

概述

在本月的专栏中,我将讨论以下主题:
  • 用户控件是什么?
  • 什么是自定义控件?
  • 用户控件和自定义控件之间的区别是什么?
我还将介绍一些高级主题,有关自定义控件如状态管理和自定义控件的呈现方式。

用户控件是什么?

用户控件是自定义的、 可重复使用的控件,并且使用相同的技术的使用,而 HTML 和 Web 服务器控件。它们提供了一条捷径进行分区,并在 ASP.NET Web 应用程序中重复使用常见的用户界面。他们使用 Web 窗体页起作用的同一个 Web 窗体编程模型。有关 Web 窗体编程模型的更多详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) Web 站点:
Web 窗体页的简介
http://msdn2.microsoft.com/en-us/library/65tcbxz3 (vs.71).aspx

Web 窗体代码模型
http://msdn2.microsoft.com/en-us/library/015103yb (vs.71).aspx

如何创建用户控件

您使用来创建用户控件的语法是可用于创建 Web 窗体页 (.aspx) 的语法类似。唯一的区别是不包括用户控件<html>,<body>和<form>因为 Web 窗体页承载该用户控件的元素。若要创建一个用户控件,请按照下列步骤操作:</form></body></html>
  1. 打开文本或 HTML 编辑器,并创建一个公开的所有属性、 方法和事件的服务器端代码块。
    <script language="C#" runat="server">
       public void button1_Click(object sender, EventArgs e)
       {
          label1.Text = "Hello World!!!";
       }
    </script>
    
  2. 创建用户控件的用户界面。
    <asp:Label id="label1" runat="server"/>
     <br><br>
    <asp:button id="button1" text="Hit" OnClick="button1_Click" runat="server" />
    

如何在 Web 窗体页中使用的用户控件

  1. 在 Microsoft Visual Studio.NET 2002年、 Microsoft Visual Studio.NET 2003年、 Microsoft Visual Studio 2005 中或任何文本编辑器中创建新的 Web 窗体页 (.aspx)。
  2. 声明@ Register指令。例如,使用下面的代码。
    <%@ Register TagPrefix="UC" TagName="TestControl" Src="test.ascx" %>
    注意假定用户控件和 Web 窗体页是相同的位置。
  3. 若要在 Web 窗体页中使用该用户控件,请在@ Register指令后使用下面的代码。
    <html>
        <body>
              <form runat="server">
                   <UC:TestControl id="Test1" runat="server"/>
              </form>
        </body>  
    </html>
    

如何以编程方式创建用户控件的实例,在代码隐藏文件的 Web 窗体页中

前面的示例实例化用户控件以声明方式在 Web 窗体页中使用@ Register指令。但是,您可以动态实例化用户控件并将其添加到页上。下面是执行这项工作的步骤:
  1. 在 Visual Studio 中创建新的 Web 窗体页。
  2. 导航到针对此 Web 窗体页生成的代码隐藏文件。
  3. Page_Load事件的类中,编写下面的代码。
    // Load the control by calling LoadControl on the page class.
    Control c1 = LoadControl("test.ascx");
                
    // Add the loaded control in the page controls collection.	
    Page.Controls.Add(c1);
    
    注意在页生命周期的某些事件,您可以动态地添加用户控件。

    有关详细信息,请访问以下 Web 站点:
    以编程方式将控件添加到 Web 窗体页
    http://msdn2.microsoft.com/en-us/library/kyt0fzt1 (vs.71).aspx

    控件执行生命周期
    http://msdn2.microsoft.com/en-us/library/aa719775 (vs.71).aspx

    动态 Web 控件,回发时,视图状态,则根据 Scott 芬
    http://aspnet.4guysfromrolla.com/articles/092904-1.aspx

用户控件的处理方式

当请求的用户控件的页面时,将出现以下情况:
  • 页分析器分析@ Register指令中的Src属性中指定的.ascx 文件,并生成一个从System.Web.UI.UserControl类中派生的类。
  • 解析程序然后将动态编译类为一个程序集。
  • 如果您使用的 Visual Studio,然后在设计时,Visual Studio 创建一个代码隐藏文件的用户控件中,并通过设计器本身预编译该文件。
  • 最后,用户控件,动态代码生成和编译完成生成时,类包含代码隐藏文件的代码 (。 ascx.cs) 以及在.ascx 文件中编写的代码。

什么是自定义控件?

一个普通的 Web 窗体或用户控件一样,自定义控件是已编译的代码组件在服务器上执行,公开对象模型,并呈现标记的文本,如 HTML 或 XML)。

如何选择自定义控件的基类

若要编写自定义控件,您应直接或间接派生新类从System.Web.UI.Control类,或从System.Web.UI.WebControls.WebControl类:
  • 如果您希望该控件呈现非可视的元素,应源自System.Web.UI.Control 。例如, <meta> 和<head>都是不可见的呈现。</head>
  • 如果您希望该控件呈现的可视化界面的客户端计算机上生成的 HTML,应源自System.Web.UI.WebControls.WebControl
如果您想要更改的功能的现有控件如按钮或标签,您可以直接派生新类与这些现有的类,并可以更改其默认行为。

简单地说,控件类还提供了依据,可以将其放置在控件树中的类的基本功能。WebControl类将添加到在客户端计算机上显示可视内容控件基类的功能。例如, WebControl类可用于控件的外观和样式属性 (如字体、 颜色和高度通过。

如何创建和使用从 System.Web.UI.Control 扩展使用 Visual Studio 的简单自定义控件

  1. 开始 Visual Studio。
  2. 创建一个类库项目,并为其指定一个名称,例如,CustomServerControlsLib。
  3. 将源代码文件添加到项目中,例如,SimpleServerControl.cs。
  4. 在引用部分中包括System.Web命名空间的引用。
  5. 请检查是否在 SimpleServerControl.cs 文件中包含下面的命名空间。
    System
    System.Collections
    System.ComponentModel
    System.Data
    System.Web
    System.Web.SessionState
    System.Web.UI
    System.Web.UI.WebControls
    
  6. 继承控件的基类的SimpleServerControls类。
    public class SimpleServerControl : Control
  7. 重写Render方法将输出写入到输出流。
    protected override void Render(HtmlTextWriter writer) 
    {
    	 writer.Write("Hello World from custom control");
    }
    
    注意HtmlTextWriter类有 HTML 写入文本流的功能。HtmlTextWriter类的Write方法将指定到 HTTP 响应流的文本输出和Response.Write方法相同。
  8. 编译的类库项目。它将生成的 DLL 输出。
  9. 打开一个现有的或创建新的 ASP.NET Web 应用程序项目。
  10. 添加 Web 窗体页可以使用自定义控件的位置。
  11. 在 ASP.NET 项目的参考部分中添加对该类库的引用。
  12. 注册自定义控件的 Web 窗体页上。
    <%@ Register TagPrefix="CC " Namespace=" CustomServerControlsLib " Assembly="CustomServerControlsLib " %>
  13. 若要实例化,或使用自定义控件的 Web 窗体页上,将添加下面的代码行<form>标记。 </form>
    <form id="Form1" method="post" runat="server">
        <CC:SimpleServerControl id="ctlSimpleControl" runat="server">
        </CC:SimpleServerControl >
    </form>
    
    注意在此代码中, SimpleServerControl是该类库中的控件类名。
  14. 运行 Web 窗体页中,并且您将看到该自定义控件的输出。
如果您没有使用 Visual Studio,您需要执行以下步骤:
  1. 任何文本编辑器中打开。
  2. 创建一个名为 SimpleServerControl.cs,文件并编写的第 1 至 14 步中指定的代码。
  3. 在 PATH 变量中,将添加下面的路径:
    c:\windows (winnt)\Microsoft.Net\Framework\v1.1.4322
  4. 启动命令提示符,然后转到 SimpleServerControl.cs 存在的位置。
  5. 运行下面的命令:
    csc /t:library/输出: CustomServerControlsLib。SimpleServerControl.dll /r:System.dll /r:System.Web.dll SimpleServerControl.cs
    C# 编译器 (csc.exe) 有关的详细信息,请访问下面的 MSDN Web 站点:
    http://msdn2.microsoft.com/en-us/library/1700bbwd (vs.71).aspx
  6. 若要运行该自定义控件的 Web 窗体页上,请执行以下操作:
    1. 创建在 wwwroot 文件夹下的一个目录。
    2. 开始 Microsoft Internet Information Services (IIS) 管理器,并将标记为虚拟根目录的新目录。
    3. 创建新的目录下的 Bin 文件夹。
    4. 将自定义控件 DLL 复制到 Bin 文件夹。
    5. 将放置在新目录中前面的步骤中创建的示例 Web 窗体页。
    6. 从 IIS 管理器中运行的示例页。
既然已经生成一个简单的自定义控件,让我们来看看如何公开属性和应用该自定义控件的设计时特性。

如何公开自定义控件上的属性

我将在前面的示例中生成,并介绍可以同时使用的自定义控件的 Web 窗体页上配置的一个或多个属性。

下面的示例演示如何定义一个属性,将显示一条消息,该控件从一定数量的情况下,在该控件的属性中指定:
  1. 在文本编辑器中打开 SimpleServerControl.cs。
  2. SimpleServerControl类中添加属性。
    public class SimpleServerControl : Control
    {
       private int noOfTimes;
       public int NoOfTimes
       {
           get { return this.noOfTimes; }
           set { this.noOfTimes = value; }
       } 
       protected override void Render (HtmlTextWriter writer)
       {
         for (int i=0; i< NoOfTimes; i++)
         {
           write.Write("Hello World.."+"<BR>");
         } 
       }
    }
    
  3. 编译自定义的控件。
  4. 若要使用自定义控件的 Web 窗体页上,请向控件声明添加新的属性。
    <CC:SimpleServerControl id="ctlSimpleControl" NoOfTimes="5" runat="server"></CC:SimpleServerControl>
  5. 运行页时,将显示消息"Hello world"从自定义控件多次为该控件的属性中指定。

如何将设计时特性应用于自定义控件

为什么需要使用设计时特性
您在前面的示例中生成的自定义控件就能如期作用。但是,如果您想要在 Visual Studio 中使用该控件,您可能希望的NoOfTimes属性会自动突出显示在属性窗口中自定义控件选择在设计时。

要做到这一点,您需要向 Visual Studio 中,您可以做到这一点在称为属性的 Visual Studio 中使用的功能提供的元数据信息。属性可以定义一个类、 方法、 属性或字段。当 Visual Studio 加载自定义控件的类时,它检查在类、 方法、 属性或字段级别定义的任何属性,并在设计时中相应地更改自定义控件的行为。

若要查找有关属性的详细信息,请访问下面的 MSDN Web 站点:
http://msdn2.microsoft.com/en-us/library/Aa288059 (VS.71).aspx
让我们生成通常使用的示例,使用属性:
  1. 在文本编辑器中打开 SimpleServerControl.cs。
  2. 介绍在类级别上,一些基本的属性 — 例如, DefaultPropertyToolboxDataTagPrefixAttrbute。我们将我们的示例基于这三个属性。
            [
    	// Specify the default property for the control.		
    	DefaultProperty("DefaultProperty"),
    	
    	// Specify the tag that is written to the aspx page when the
            // control is dragged from the Toolbox to the Design view. 
    	// However this tag is optional since the designer automatically 
    	// generates the default tag if it is not specified.		
    	ToolboxData("<{0}:ControlWithAttributes runat=\"server\">" +
    		"</{0}:ControlWithAttributes>")
    	]
    	public class ControlWithAttributes : Control
    	{
    		private string _defaultProperty;
    		public string DefaultProperty
    		{
    			get { return "This is a default property value"; }
    			set { this._defaultProperty = value; }
    		}
    
    		protected override void Render(HtmlTextWriter writer)
    		{
    			writer.Write("Default Property --> " + 
    			DefaultProperty + "");
    		}
             }
    
  3. 还有一个名为TagPrefixAttrbute的多个标签。它是程序集级特性,当将控件从工具箱拖动到设计器中提供的标记前缀。否则,该设计器默认情况下生成一个前缀,如"cc1"。TagPrefixAttrbute不直接应用到控件类中。若要应用TagPrefixAttrbute,打开 AssemblyInfo.cs,包括以下行的代码,然后重新生成项目。
    [assembly:TagPrefix("ServerControlsLib ", "MyControl")]
    注意如果您想要生成使用命令行的源,则需要创建 AssemblyInfo.cs 文件,将文件放置在包含源文件的目录中运行下面的若要生成控件的命令:
    1&gt; csc /t:library/输出: ServerControlsLib.dll /r:System.dll /r: System.Web.dll *.cs

用户控件和自定义控件之间的区别是什么?

现在,您已经基本了解什么是用户控件和自定义控件以及如何创建它们,让我们快速回顾一下两者之间的差异。
收起该表格展开该表格
因素用户控件自定义控件
部署用于单个应用程序方案

在源窗体 (.ascx) 中部署以及应用程序的源代码

如果需要在多个应用程序中使用相同的控件,它引入了冗余和维护问题
设计,以便它可以由多个应用程序

部署应用程序的 Bin 目录中,或者可以在全局程序集缓存中

分布式轻松地而无需使用冗余和维护相关的问题
创建创建是类似的方式创建 Web 窗体页 ;适合于应用程序快速开发 (RAD)编写涉及大量代码,因为没有设计器支持
内容更多好的选择时页眉和页脚进行时例如,需要在固定的布局内, 静态内容更适合于,当应用程序需要动态内容,用于显示 ;可重复使用跨应用程序,例如,对于数据绑定动态行的表控件
设计书写不需要很多应用程序设计,因为它们都在设计时编写,主要包含静态数据从零开始写作则需要更好地理解控件的生命周期和正常情况下负责在用户控件中的事件执行的顺序

高级的主题

接下来,让我们看一看几个在开发自定义控件时,您可以使用的高级功能。

状态管理

Web 应用程序基于 HTTP 是无状态的。一个页和它的子控件在每次请求创建,并且在请求结束后被释放。要保持传统的 ASP 编程中的状态,也可以使用会话和应用程序的对象。但是,为此,您需要做大量的编码。若要避免此问题,ASP.NET 提供了一种机制,称为视图状态在多个请求之间维护状态。若要了解有关状态管理和视图状态的详细信息,请访问下面的 MSDN Web 站点:
Web 窗体状态管理简介
http://msdn2.microsoft.com/en-us/library/75x4ha6s (vs.71).aspx

ASP.NET 视图状态
http://msdn.microsoft.com/msdnmag/issues/03/02/cuttingedge/default.aspx

保存 Web 窗体页使用视图状态的值
http://msdn2.microsoft.com/en-us/library/4yfdwycw (vs.71).aspx
使用中的自定义控件的视图状态的示例
ViewStateExample.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text;

namespace ServerControlLib
{
	/// <summary>
	/// When a page framework reloads this control after postback, it   
        /// will restore the values which are in view state.
	/// This control can easily perform state management without 
        /// implementing our own logic for maintaining the state.
	/// </summary>
	public class ViewStateExample : WebControl
	{
		// Text to be displayed in Text box control.
		private string _text;
		
		/*
		 * This property needs to be populated before every 
                 * postback in order to 
		 * retain its value.
		*/ 
		public string Text
		{
			get { return (_text == null) ? "_text property is empty"  : _text; }
			set { _text = value; }
		}

		/*
		 * This property needs to be filled once and should be 
                 * available on the successive postbacks.
		*/ 
		public string TextInViewState
		{
			get
			{
				object o = ViewState["TextInViewState"];
				return (o == null) ? "View state is empty" : (string)o;
			}
			set { ViewState["TextInViewState"] = value; } 
		}

		/*
		 * Over-ridden method on WebControl base class which                   
                 * displays both of the property values 
		 * i.e. one stored in view state and other which is not 
                 * saved in view state.
		*/
		protected override void RenderContents(HtmlTextWriter writer)
		{
			writer.Write("Text Without View State = ");
			writer.Write(Text);
			writer.Write("<hr><br>");
			writer.Write("Text In View State = ");
			writer.Write(TextInViewState);
		}
	}
}
使用 Web 窗体页上的前一个控件的示例
ViewStateExampleDemo.aspx
<%@ Page Language="C#" %>
<%@ Register TagPrefix="CC" Namespace="ServerControlLib" Assembly = "ServerControlLib" %>

<html>
  <head>
    <script runat="server">
      void button1_Click(object sender, EventArgs e)
      {
          Control1.Text = textbox1.Text;
          Control1.TextInViewState = textbox2.Text;
      }
    </script>
  </head>
  <body>
    <form runat="server" ID="Form1">
      <br>
      Property Value Without View State: <asp:TextBox id="textbox1" 
        runat="server" />
      <br>
      Property Value with View State: <asp:TextBox id="textbox2" 
        runat="server" />

      <asp:Button text="Cause Postback" onClick="button1_Click" 
        id="button1" Runat="server" />

      Output from the ViewStateExample Control :
      <CC:ViewStateExample id="Control1" runat="server"/>
    </form>
  </body>
</html>

呈现

在此部分中,我将简要介绍哪些控件类或WebControl类从派生的自定义控件时,应重写的方法。
System.Web.UI.Control 类的呈现方法
呈现方法System.Web.UI.Control类的信息,请访问下面的 MSDN Web 站点:
Control.Render方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.control.render (vs.71).aspx

Control.RenderControl方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.control.rendercontrol (vs.71).aspx

Control.RenderChildren方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.control.renderchildren (vs.71).aspx
控件在页上的呈现方式
每一页都有一个控件树,它表示该页面的所有子控件的集合。若要呈现的控件树, HtmlTextWriter类的对象被创建,包含要在客户端计算机上呈现的 HTML。该对象将传递给RenderControl方法中。反过来, RenderControl方法调用呈现方法。然后, Render方法调用RenderChildren方法,在每个子控件,直到达到该集合的末尾进行递归循环。下面的代码示例通过最好地说明了此过程。
public void RenderControl(HtmlTextWriter writer) 
{
    // Render method on that control will only be called if its visible property is true.
    if (Visible)
    {
        Render(writer);
    }
}

protected virtual void Render(HtmlTextWriter writer) 
{
    RenderChildren(writer);
}
protected virtual void RenderChildren(HtmlTextWriter writer) 
{
    foreach (Control c in Controls) 
    {
        c.RenderControl(writer);
    }
} 
System.Web.UI.WebControl 类的呈现方法
呈现方法System.Web.UI.WebControl类的信息,请访问下面的 MSDN Web 站点:
WebControl.RenderBeginTag方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.renderbegintag (vs.71).aspx

WebControl.RenderContents方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.rendercontents (vs.71).aspx

WebControl.RenderEndTag方法
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.renderendtag (vs.71).aspx
WebControl 类的呈现发生
下面的代码示例演示自定义控件的呈现方法。
protected override void Render(HtmlTextWriter writer)
{
    RenderBeginTag(writer);
    RenderContents(writer);
    RenderEndTag(writer);
}
您不需要重写WebControl类的呈现方法。如果您想要呈现的WebControl类中的内容,您需要重写RenderContents方法。但是,如果您仍想要重写Render方法,您必须重写RenderBeginTag方法,以及在上一个代码示例中所示的特定顺序的RenderEndTag方法。

结论

这就是现在在用户控件和自定义控件在 ASP.NET 1.0 和 ASP.NET 1.1 中的。我希望此列可帮助您了解它们与开发它们可以采取的各种方法之间的基本区别。

感谢您抽出宝贵时间。我们希望在不久的将来编写的自定义控件,如状态管理、 控件样式、 复合控件和自定义控件的设计时支持的高级主题有关的详细信息。

有关控件的详细信息,请访问下面的 MSDN Web 站点:
ASP.NET 服务器控件开发基础知识
http://msdn2.microsoft.com/en-us/library/aa310918 (vs.71).aspx

广泛的检查的用户控件
http://msdn2.microsoft.com/en-us/library/ms972975.aspx

构建模板自定义 ASP.NET 服务器控件
http://msdn2.microsoft.com/en-us/library/Aa478964.aspx

ASP.NET 服务器控件中的事件
http://msdn2.microsoft.com/en-us/library/aa720049 (vs.71).aspx

与用户控件的复合控件
http://msdn2.microsoft.com/en-us/library/aa719735 (vs.71).aspx

开发 ASP.NET 服务器控件
http://msdn2.microsoft.com/en-us/library/aa719973 (vs.71).aspx

开发自定义控件: 重要概念
http://msdn2.microsoft.com/en-us/library/aa720226 (vs.71).aspx

添加到 ASP.NET 控件的设计时支持
http://msdn2.microsoft.com/en-us/library/Aa478960.aspx
一直以来,尽情地提交所需的主题的意见在将来解决列,或者在知识文库中使用 诚征意见 表单。

属性

文章编号: 893667 - 最后修改: 2013年5月25日 - 修订: 2.0
这篇文章中的信息适用于:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
关键字:?
kbhowto kbasp kbmt KB893667 KbMtzh
机器翻译
重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。
点击这里察看该文章的英文版: 893667
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com