ASP.NET立即上手教程(14)
2007-09-13 23:58:18   来源:   评论:0 点击:

创作自定义服务器控件

本章的内容演示高级开发者如何书写A .NET页面中的服务器控件。通过书写自定义的服务器控件,可以封装定制的用户接口以及其他功能。本教程通过一系列逐渐展开的例子提供了创作自定义控件的入门知识。关于控件创作的更多信息,参阅.NET Framework SDK文档中“开发A .NET服务器控件”部分。

重要提示:本章表述的控件尽管可以在A .NET页面的运行时刻正常运行,但是在页面开发工具,如Microsoft Visual Studio.NET,设计时却有可能无法正常工作。为了在设计器中正常工作,自定义控件需要应用设计时刻属性----该属性在本章不进行表述。关于设计时刻属性的细节,参阅SDK文档中“组件的设计时刻属性”部分。

开发一个简单的自定义控件

开始创作自己的A .NET服务器控件其实很容易。要想建立一个自定义控件,你需要做的全部工作仅仅是定义一个从System.Web.UI.Control继承而来得类,并且覆盖它的Render方法。Render方法带有一个System.Web.UI.HtmlTextWriter类型的参数。控件需要发送到客户端的HTML代码作为字符串参数传递给HtmlTextWriter的Write方法。

定义简单的属性

属性类似于“聪明”的字段,它具有存取器方法。你可能从你的控件中expose属性而不是公共字段,因为属性允许数据隐藏,可以版本控制,并且可以被可视化设计工具所支持。属性具有get/set存取器方法,用来设置和取得属性值,并允许在必要的时候执行额外的程序逻辑。

下面的例子展示如何增加简单的属性,它对应私有数据类型,如整数、布尔和字符串。这个例子定义了三个属性:Me age是字符串类型、Me ageSize是枚举类型、Iteratio 是整数类型的。请注意设置简单属性和枚举属性的A .NET页面语法。

定义类属性

如果类A的属性类型是类B,那么B的属性被称为A的子属性。下面的例子定义了一个自定义服务器控件SimpleSu roperty,它有一个Format类型的属性。Format是一个具有两个私有属性的类:Color和Size ,他们依次成为了SimpleSu roperty的子属性

注意A .NET具有特定的语法来设定子属性。下面的代码显示了如何显式设置SimpleSu roperty的子属性Format.Color和Format.Size。“-”语法表示子属性。

< impleControlSamples:SimpleSu roperty Me age="Hello There" Format-Color="red" Format-Size="3" runat=server/>

找回内部的内容

每个控件都有一个从System.Web.UI.Control继承的Controls属性。这是一个集合属性,表示控件的子控件。如果一个控件没有用ParseChildrenAttribute或者ParseChildrenAttribute(ChildrenA roperties = false)标识,那么当控件在页面中声明的时候,A .NET页面框架就会应用下面的解析逻辑。如果解析器在控件的标签中遇到嵌套控件,它就会建立控件实例,并将其添加到控件的Controls属性。标签间的文字文本被添加为LiteralControl。任何其他嵌套元素产生一个解析错误。

下面的例子展示了一个自定义控件SimpleI erContent,通过检查LiteralControl是否被添加到它的控件集合中,来决定是否将交付的文本增加到它的标签之间。如果是,它就取得LiteralControl的Text属性,然后将其添加到输出字符串。

重要提示:如果你的自定义控件从WebControl衍生而来,它将不会有上面例子中描述的解析逻辑,因为WebControl用ParseChildrenAttribute(ChildrenA roperties = true)标记,它导致不同的解析逻辑。关于ParseChildrenAttribute的更多信息,请参阅.NET Framework SDK文档。

开发复合控件

你可以使用类的合成,通过组合现在有的控件来创作新的控件。复合控件类似于用户控件,也是使用A .NET语法来创建。用户控件和复合控件的主要区别是:用户控件是扩展名为.ascx的文本文件,而组合控件是编译过的,已汇编的方式使用。

开发组合控件的关键步骤是:

· 覆盖从Control继承的保护型方法CreateChildControls,建立子控件的实例,并将其添加到控件集合。

· 如果页面中的复合控件实例需要重复创建,需要引入System.Web.UI.INamingContainer接口。这是一个没有方法的标签接口。当他被控件引入的时候,A .NET将在这个控件下面建立一个新的名称空间。这就保证了子控件在控件的继承树中具有唯一的ID。

你不必覆盖Render方法,因为子控件提供了交付逻辑。你可以引申子控件合成的属性。

下面的例子定义了一个复合控件Composition1,它合并了System.Web.UI.LiteralControl和System.Web.UIWebControls.TextBox.Composition1,引申了一个整数类型的自定义属性Value,映射TextBox到的Text属性。

相关热词搜索:ASP.NET立即上手教程(14)

上一篇:.NET环境下几种不同的邮件发送解决方案
下一篇:ASP.NET立即上手教程(13)

分享到: 收藏
频道总排行
频道本月排行