开发ASP.NET的用户和服务器控件

翻译|其它|编辑:郝浩|2005-06-22 10:14:00.000|阅读 1455 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


简介

.NET的问世使得编程模式许多变化的发生,其中包括我们使用表格和控件的方式,由于试图达到象传统的基于Windows表单的应用程序那样的交互性,在互联网应用程序方面就更是如此了。

通过推出ASP.NET ViewState和对象缓冲等工具,微软在这方面已经取得很大的进展。其中的工具之一是ASP.NET的用户控件,并将这些控件看作为应用程序中实际的对象。本篇文章将讨论如何在实际工作中使用用户控件,并为读者将来开发更为复杂的用户控件打下良好的基础。

ASP.NET中的用户控件是什么?

如果曾经涉足过ASP.NET,读者一定会听到过许多有关用户控件的定义,既然这样,我们的就再加上一个又有何妨?ASP.NET用户控件就是由一组封装有一定功能的一个或多个服务器控件或静态HTML元素。它可以简单到仅仅是一个现有服务器控件(例如可以旋转的图形控件或在文本框中存储有日期的日程控件)功能的扩展,也可以包括几个互相作用、协同完成一件任务的几个元素。

一般情况下,用户控件可以驻留在包含有其他元素的网页上,这种功能的分散性正是使用独立的可重用的用户控件开发应用程序的基础,控件可以动态地被加载到网页的不同部分。微软已经发布了IBuySpy应用程序来演示这一架构,读者可以到www.ibuyspy.com下载该应用程序。

有了这一概念,读者可能会感到纳闷儿:ASP.NET中的用户控件与简单地在网页中嵌入其他网页有什么区别?在ASP 3.0中我们不是已经能够这样作了吗?问题的答案是,在.NET框架下,用户控件被看作是一个独立的对象。通过在代码(或HTML)中存取控件的属性,其他元素就可以通过编程方式很方便地与用户控件进行交互。尽管在ASP 3.0中也能实现相似的功能,但要麻烦得多。由于用户控件被看作是对象,我们就可以非常方便地存取其模式、大小、颜色等属性。

用户控件 .vs. 其他控件

使用ASP.NET时容易造成混乱的一个问题是许多不同类型控件之间的区别以及应当使用哪个控件。尽管微软试图为我们区别这些不同的控件,但对于只有极小区别的元素而言,其中的混淆仍然是存在的。例如,ASP.NET控件(也被称作服务器控件)是随同.NET框架一块儿发送的服务器端组件。服务器控件是编译后的DLL文件,它是不能被编辑的,但它可以在设计时或运行时通过public属性被其他控件操作。我们可以开发定制的服务器控件。(也被称作定制控件或复合控件。)

相反,用户控件包括以前开发的服务器控件(用在用户控件中也被称作委托控件),它有一个可以编辑和改变的界面,可以通过要建立的的属性在设计和运行时对用户控件的界面进行操作。尽管第三方厂商为ASP.NET开发的功能可能有多个控件,但它们都以编译后的服务器组件的形式存在。定制服务器控件就是.NET中实现ActiveX Web控件功能的控件。

创建一个简单的用户控件

在本篇文章中,我们将创建2个用户控件。为了说明基础知识,我们的第一个例子将会是一个非常简单的日历控件。该控件以现有的ASP.NET的日历控件为基础,但添加了一个存储选定值的文本框。日历控件的可视性通过一个按钮进行切换。用户控件在要求输入日期的表单上非常有用。

为了创建第一个用户控件,我们需要在工程中添加一个用户控件文件。首先,创建一个新的C# ASP.NET Web应用程序,在工程管理器中右击该工程,选择“添加新条目”,然后选择“Web用户控件”。上面的操作将在该工程中添加一个后缀为.ascx的文件,这就是用户控件用来对外披露其界面的文件。.ASCX 文件不能在浏览器中直接浏览,它需要被放在一个容器(例如Web表单)才能浏览。因此,我们还需要在该工程中添加一个新的Web表单,并打开它,将用户文件拖到该网页中,就会显示出如下所示的图形:





需要注意的是,在设计窗口中控件不会显示出任何界面,如果我们的控件要占用一定的空间,就会出现问题,必须在浏览器中才能看到它的模样,并进行适当的调节。还需要注意的是,网页将控件表示为对象,如果点击HTML标签查看HTML代码,我们会看到如下所示的屏幕显示:




在网页上,带有标记的控件与服务器控件非常相似。需要注意的是,第二行的@ Register命令在网页上注册该控件,我们可以自由地在网页上添加该控件的许多实例。TagPrefix属性指定控件用的前缀,它有点象几个控件共享一个前缀值的名字空间,这也是所有的ASP.NET服务器控件指定“
其次,打开用户控件文件,它包括有一个ascx文件和一个ascx.cs文件。在设计窗口中,拖动并定位一个文本框服务器控件、一个按钮服务器控件和一个日历服务器控件。在用户控件中使用的元素元素作“成份控件。在HTML视图中,以如下形式对成份控件进行格式化:





注意,上面的代码中没有标记。用户控件不需要这些标记,因为它将被放置在其他网页(或其他用户控件中,托管它的网页将负责添加这些公用的标记。因此,用户控件将继承所有托管网页上的标记(包括样式),除非它指定了这些标记。最后,我们就可以在文件中添加代码了。我们添加的代码如下图所示:





上面的代码与一个Web表单的作用完全相同,它将产生HTML代码,并返回给浏览器,就象用户控件生成的HTML代码是被简单地粘贴在托管网页上那样。在上面的代码中,我们发现一个按钮点击事件,网页就会被返回给浏览器。这一控件还可以添加更高级的功能,例如不发送网页和进行文本框确认的能力。



创建稍微复杂一些的用户控件

在这个例子中,我们将创建一个登录屏幕,其中包含二个标签、二个文本框服务器控件、二个确认字段服务器控件和一个按钮服务器控件。我们还会再添加1、2个属性,使得它更通用一些。





我们在代码窗口中添加下面的代码:





需要注意的第一件事是,用户控件类是抽象的,它必须被继承才能实现其功能,这是由其双亲页完成的,它将用户控件看作为一个子对象。另外,还需要注意的是,这一类是继承System.Web.UI.UserControl得来的。我们可以在代码中指定和覆盖大部分的事件和属性。在控件定义后面,我们定义了二个全局变量,其中包含着在public属性get和set例程中的值。还有,sBorderColor是个public变量,因为我们在使用标记的HTML代码中重新调用了它。







get和set例程设置全局变量的值,用户控件的属性可以在设计时的托管网页的HTML中设置,也可以在运行时的代码中设置。





我们需要注意get和set例程中的属性变量在托管网页上的控件定义中是如何被指定的,这里的值可以以字符串的形式传递。另外,如果在HTML中重新引用,属性名字是不分大小写的。通过对类设置特定的属性值,属性也可以设置为对象的子元素。要实现上述的目的,将类的ParseChildrenAttribute属性的值设置为true即可。如果要在运行时设置多个属性或创建子控件,这一方法是很有用的,DataGrid和日历服务器控件就很好地利用了这一方法。





我们将文本框的值设置为sUsername的值,这将触发OnPreRender事件,这一事件是网页生命周期的一部分,我们将它覆盖,以触发我们自己的事件。OnPreRender事件是网页创建期间触发的最后事件之一,因此,我们可以断定,文本框的内容不会被ASP.NET网页生命周期的典型机制破坏。如果我们在Page_Load事件中执行这些代码,文本框中的内容就可能受到破坏,因为ViewState将会清除掉文本框中的值。

设置username属性并非是必需的,但对于使用各种不同的值对控件进行完全测试是很重要的,我们可能得到意想不到的结果。占位符是在上面的代码中被设置的,使我们能够从其他地方得到用户名,例如cookie或以前的登录。完成以后,该控件可以放置在任何需要登录的网页中。逻辑可以放在Page_Load事件中,如果用户有需要的信任状,Page_Load事件将把控件的visibility属性设置为false,由于控件是被看作是一个完整的对象的,因此可以通过this.visibility = false这样简单的语句完成。

结论

尽管这一控件仍然是十分简单的,但它为我们创建更复杂的用户控件奠定了良好的基础,用户控件可以用来将大规模的应用软件分解为更小、更具可管理性的代码块。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP