- 服务器控件概述
- 编译和部署服务器控件
- 暴露属性
- 为控件选择基类
- 应用设计期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阶段相对应的。
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
当用户控件需要用在一个可视化设计器中,就会发现缺少在设计期所期待的一些标准特征。
[ToolboxData( " <{0}>:PrimeGenerator Number=\ " 15 \ " runat=\ " server\ " ></{0}:PrimeGenerator> " )]
public class PrimeGenerator : Control
{ }
DefaultProperty:为控件指定了默认的属性。
ToolboxData:当控件从工具箱中被拖到设计界面时,指定了写在页面上的标签。
应用TagPrefix标签:
是一个配件层的attribute,它提供了一个标签前缀。当一个控件从工具箱中拖到设计界面时,设计器会为控件使用这个标签。因为它是一个配件层的 attribute,所以它并不直接应用于任何特定的控件,而是在一个单独的文件中声明,并且作为控件编译进同一个配件。
为了在Visual Studio.NET中使用 TagPrefixAttribute,在项目中编译 AssemblyInfo.cs 文件。如下:
[assembly:TagPrefix( " MSPress.ServerControls " , " ms " )]
显示的标签前缀将 ms 与命名空间 MSPress.ServerControls相关联,当把控件拖到页面上,标签前缀会自动生成。
如果使用命令行编译,那么就要创建一个名为 AssemblyInfo.cs的文件。然后放到有控件源代码文件的目录中。