第5章: 开发简单的自定义控件

  • 服务器控件概述
  • 编译和部署服务器控件
  • 暴露属性
  • 为控件选择基类
  • 应用设计期attribute
  • Visual Studio.NET的自定义控件
  • 调试服务器控件

      目前为止,1,是以前被部署的文本文件(.ascx 和 可选的code-behind文件)的声明创建的用户控件。
                    2,本章描述的控件时用代码写成的而且是以编译过的类库形式部署的。这里使用术语(自定义控件)说明控件被创建成托管类并且
                        在部署之前就被编译。(细节参考:.NET Framework SDK 的 “Walkthrough:Creating a Web Custom Control”)
5.1 服务器控件概述
      ASP.NET服务器控件时在服务器上执行的程序逻辑的组件。它提供了一个可编程对象模型,并且向Web浏览器客户端或其他浏览器设备提交标记文本(HTML,XML 和 WML)。服务器控件是一个ASP.NET Web应用程序的基本构造块。ASP.NET提供了一个可以实现所有必须方法的基类(System.Web.UI.Control),可以将服务器控件加入到代表.aspx页面的空间书中。Control类还能实现System.ComponentModel.IComponent接口,这个接口可以使它成为可设计的组件。可设计组件可以加入可视化设计器的工具箱中,能够被拖到一个设计界面上,能够在属性浏览器中显示它的属性。
      WebCongtrol类为表现HTML内容而在Control基类中新增一些功能,通过属性提供了对样式支持,比如:字体,宽度,背景色,前景色。
System.Web.UI.HtmlTextWriter是一个工具类,它封装了将HTML写成文本流的功能函数。注意:不要从控件中直接调用 Page.Response.Write() 方法,因为这样会打破页面框架提供的封装性。为了写入响应流可以重载Control或WebControl的一个生成方法。
SimpleControl重载Render方法与空间生命周期的Render阶段相对应的。

ContractedBlock.gif ExpandedBlockStart.gif Code
    public class SimpleControl : Control
    {
        
protected override void Render(HtmlTextWriter writer)
        {
            writer.Write(
"I don't do anything useful,");
            writer.Write(
"but at least I'm a control");
        }
    }


5.3 编译和部署服务器控件
      对于在页面上使用的自定义控件来说,必须编译成一个配件,并且在ASP.NET运行期它应该可以被访问的(DLL)。
      以下提供一些使用命令行工具编译的批处理文件。
      1,将控件的源代码复制到另一个目录中,避免覆盖掉已安装的文件。
      csc /t:library /out:MSPress.ServerControls.dll /r:System.dll /r:SystemWeb.dll SimpleControl.cs
            csc:调用C#编译器。
            /t:选项告诉编译器生成的目标配件是一个类库文件。
            /out:为输出文件提供文件名。
            /r:指明了一些配件的名称;因为这些配件的元数据会被正在编译的类引用。
      因此这里编译后会生成 MSPress.ServerControls.dll 配件。

      每一个ASP.NET应用程序都有一个特定的位置用以访问私有的配件。这个位置是一个IIS Web应用程序虚拟根目录下的bin目录。即使是子目录中需要使用的2进制文件的bin,也应该在根目录下的bin中。
      2,这一步将前面创建的MSPress.ServerControls.dll 文件复制到Web应用程序的bin目录中:
            copy MSPress.ServerControls.dll  <path to the root of you web application>\bin
          所创建并且复制到应用程bin目录中的配件被认为是私有的配件,因为只有这个Web应用程序的页面可以引用它。

在页面中使用自定义控件:
      在页面中使用自定义控件与SDK发行的服务器控件类似,两者只有一点不同。页面顶部的Register指令来为其控件注册一个标签前缀。
      <%@ Register TagPrefix="msp" Namespace="MSPress.ServerControls" Assembly="MSPress.ServerControls" %>
      Namespace : 指定了自定义控件声明的命名空间。
      Assembly:指定了控件将要生成的配件。但是不要使用.dll文件扩展名。因为文件扩展名不是配件名字的一部分。

5.4.1 从WebControl类中派生(为控件继承更多的属性:字体,宽度,高度等)
      如果自定义控件是从WebControl类而不是Control类派生而来,那么得到的控件就能集成许多附加的属性,比如:字体,高度,宽度和其他样式相关的属性。这些属性允许开发者自定义控件的视觉外观。当从WebControl派生时,应遵从如下约定:
      1,包含一个System.Web.UI.WebControls 命名空间的引用
      2,不要通过重载 Render 方法来直接输出流中写数据,这是因为WebControl 的 Render 方法实现了一段程序,这段程序向外部提供带有样式信息的标签。如果想在空间的标签内提供内容,那么可以用重载的 RenderContents 方法来实现。
      3,如果想提供一个不同于<span> 的标签,那么就重载从WebControl类继承来的 TagKey属性或TagName属性(对于非标准HTML标签来说)。WebContrl类默认的设置时生成一个<span>标签。

5.5 为控件选择基类
      下面指导方针将帮助你决定控件要从哪个基类派生而来:
      1,如果控件要生成非可视化的元素或显示给非HTML客户端,那就应该从System.Web.UI.Control里派生。<meta>,<xml>就是非可视化元素显示的例子。
      2,如果想提供一些在客户端生成可视化界面的HTML,那么就应该System.Web.UI.WebControls.WebControl派生。
      3,当想扩展或修改控件功能时,应该从一个已存在的控件派生,比如标签,按钮,文本框。可以从任何一个System.Web.UI.WebControls命名空间中的控件或自定义控件派生。但是不要从System.Web.UI.HtmlControls命名空间中的控件派生。Visual Studio .NET设计器不承认直接或间接派生于HtmlControl的控件,因为这些控件会破坏HTML控件模式。在声明性页面语法中,HTML控件的出现时没有标签前缀的(如<Button runat="server">)。但是当在页面中声明式的使用时,素有的自定义控件都需要一个标签上的前缀。

5.6 应用设计期 attribute
      当用户控件需要用在一个可视化设计器中,就会发现缺少在设计期所期待的一些标准特征。

 [DefaultBindingProperty( " Number " )]
 [ToolboxData(
" <{0}>:PrimeGenerator Number=\ " 15 \ "  runat=\ " server\ " ></{0}:PrimeGenerator> " )]
 
public   class  PrimeGenerator : Control
ExpandedBlockStart.gifContractedBlock.gif 
{ }

      DefaultProperty:为控件指定了默认的属性。
      ToolboxData:当控件从工具箱中被拖到设计界面时,指定了写在页面上的标签。
      
应用TagPrefix标签:
      是一个配件层的attribute,它提供了一个标签前缀。当一个控件从工具箱中拖到设计界面时,设计器会为控件使用这个标签。因为它是一个配件层的 attribute,所以它并不直接应用于任何特定的控件,而是在一个单独的文件中声明,并且作为控件编译进同一个配件。
      为了在Visual Studio.NET中使用 TagPrefixAttribute,在项目中编译 AssemblyInfo.cs 文件。如下:

using  System.Web.UI;
[assembly:TagPrefix(
" MSPress.ServerControls " " ms " )]

      显示的标签前缀将 ms 与命名空间 MSPress.ServerControls相关联,当把控件拖到页面上,标签前缀会自动生成。
      如果使用命令行编译,那么就要创建一个名为 AssemblyInfo.cs的文件。然后放到有控件源代码文件的目录中。

csc  / t: library  / out :MSPress.ServerControls.dll  / r:System.dll  / r:System.Web.dll SimpleControl.cs PrimeGenerator.cs StyledPrimeGenerator.cs AssemblyInfo.cs

 

转载于:https://www.cnblogs.com/ruijinzhao/archive/2009/09/07/1562072.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值