ASP.NET控件
ASP.NET控件类型[ ]
控件时插件是构建图像用户界面(GUI)的模块,你熟悉的的控件包括:按钮、复选框、列表框。控件为用户提供了显示偏好,输入数据或者做出选择的途径。WEB控件包括四类类型:
- HTML控件:最初的空间可用于任何HTML页面中,就如同他们工作在其他页面中一样,也都能工作在ASP.NET中。
- HTML服务器控件:他们是基于最初HTML控件,但是,功能有所增强,可以在服务器端执行处理。
- ASP.NET服务器控件:比较丰富、可扩展的服务器控件集成在ASP.NET编程模型中,它们在客户端呈现为HTML,并提供与HTML服务器控件相同,甚至更多的功能,主要包括以下控件:
- 用户控件和自定义控件:由开发人员创建的控件。
ASP.NET事件[ ]
ASP.NET有数千个事件,应用程序有事件,每一个会话也有事件,并且页面和许多服务器控件都会触发事件。所有的ASP.NET事件都在服务器端处理,有些时间立刻发送到服务器,另外一些时间则被储存,直到下次页面回传到服务器。
事件是在服务器端处理的,ASP.NET事件与传统客户端应用程序中的事件稍有不同,在传统客户端的应用程序中,事件本身和事件处理程序都在客户端,在ASP.NET应用程序中,事件通常都在客户端触发,在服务器端处理。
考虑一个包含按钮控件的ASP.NET页面,当单击该按钮时,触发了一个Click事件,不同于HTML按钮控件,ASP.NET的按钮有一个runat=server属性,它为所有HTML按钮标准添加服务器端处理属性,当触发Click事件时,浏览器则发送页面到服务器,以便处理客户端事件,与此同时,一个事件消息传送到服务器,服务器端确定是否与Click事件关联的事件处理程序,如有,则在服务器端执行该时间处理程序。
事件消息通过HTTP POST方式发送到服务器,ASP.NET将自动处理所有捕获事件的基础结构,将它传送到服务器,并处理时间,作为程序员,你所要做的就是创建事件处理程序。许多时间,如MouseOver,不会进行服务器端事件处理,因为那样做会降低性能,由于所有服务器处理都需要传回,因此,不能要求每次发生MouseOver时都回传到页面,如果一定要处理这些事件,那么,只能在客户端处理,这超出了ASP.NET的范围。
事件参数[ ]
事件依靠委托实现,委托时一个对象,它封装了对方法的描述,即处理事件所指定的任务。ASP事件处理程序有两个参数,并且返回空值,第一个参数触发事件的对象,第二个参数称为事件参数,它包括事件消息的细节,如果有的话,对于多数事件,事件参数是EventArgs类型,它没有任何属性,因此,事件的通用原型为:
private void EventName(Object sender, EventArgs e)
对于某些控件,事件参数可以从EventArgs类派生,并显示该事件类型的属性细节。
应用程序事件与会话事件[ ]
ASP.NET支持应用程序事件和会话事件,这二者为传统ASP程序员所熟知,当应用程序启动时,将触发Application_Start事件,这时,可以初始化整个应用程序中需要使用的各种资源。当应用程序停止时,将触发Application——End事件,这时,关闭资源,同时执行任何其他必要的日常管理,垃圾回收机制将自动释放内存,然而,如果分配了托管的资源,那么必须手动删除。
会话事件也是如此,当用户第一次请求应用程序的页面时,会话开始,当应用程序关闭会话或会话超时时,会话结束,当会话开始时,触发 Session_Start事件,这时可以初始化生命周期中使用的资源。
页面和控件事件[ ]
页面和控件都包含事件,它们继承自Control类,所有这些事件都传递没有属性的EventArgs类型的事件参数,下表是大多数公共事件:
事件名称 | 说明 |
DataBinding | 当控件绑定到数据源时发生 |
Disposed | 当控件从内存中释放时发生 |
Error | 只有在页面中,当抛出未处理的异常时发生 |
Init | 当控件初始化时发生 |
Load | 当控件加载到页面对象时发生 |
PreRender | 当控件准备做输出时发生 |
Unload | 当控件从内存中卸载时发生 |
回传事件 VS 非回传事件[ ]
回传事件促使表单立刻回传到服务器,这包括单击类型的事件,与之相对的是,某些事件被认为是非回传的,因为,事件并不立刻回传到服务器,这些事件有控件捕获,直到再次发生回传,设置非回传事件控件的AutoPostBack属性为true,则可以强制使它们采用回传方式。
ASP.NET服务器控件[ ]
在ASP.NET中,最为重要的是ASP.NET服务器控件,服务器空间包括方法已经与之关联的事件处理程序,并且这些代码都在服务器端执行,如果控件包括可视化组成部分,那么ASP.NET将在检测目标浏览器接受能力的情况下,为浏览器呈现传统的HTML。
ASP.NET服务器控件提供统一的编程模型,例如,在HTML中,input标签可用于按钮、单行文本、复选框、隐藏域和密码,二多行文本域,则必须使用<textarea>标签,使用ASP.NET服务器控件时,每种不同的功能类型将对应一种特定空间。
ASP.NET服务器控件包含了HTML控件可以提供的所有功能,甚至更多,其中包括基本控件,例如:按钮、文本标签、复选框、表格,高级数据控件、验证控件、安全和登录控件以及一些富控件。
下面列举了位于内容文件窗体中,实现ASP.NET服务器控件的语法:
<asp:controlType id="ControlID" runat="server" thisProperty="this value" thatProperty="that value"/>
控件插件总是以asp:开头,这就是标记前缀。controlType是控件的类型或类,你可以利用id属性,以编程方式引用空间实例,runat属性告知服务器,该控件在服务器端运行。
你可以再尖括号中声明其它属性,例如:为TextBox声明Text和Width属性,如下所示:
<asp:TextBox ID="txtBookName" runat="server" Width="250px" Text="Enter a book name."/>
虽然ASP.NET可以允许属性值周围不设置引号,但是,ASP.NET服务器控件必须使用良好的XHTML语法,需要明确的是,正如上文所示,尖括号必须明确关闭自身或者具有关闭元素,所以,上面的TextBox也可以书写为:
<asp:TextBox ID="textBookName" rant="server" Width="250px" Text="Enter a book name."></asp:TextBox>
另外,许多ASP.NET服务器空间可以在打开和关闭标签之间使用内部HTML,例如,在TextBox控件中,可将Text属性指定为内部HTML,而不是将其设置在打开标签的属性中,上面的控件可以等价的写为:
<asp:TextBox ID="textBookName" runat="server" Width="250px">Enter a book name.</asp:TextBox>
HTML服务器控件[ ]
服务器不会处理普通的HTML控件,例如<h1>、<a>和<input>,它们将直接被发送到客户端,有浏览器进行显示,可以为服务器提供标准的HTML控件,将他们转化为HTML服务器控件,使得他们能在服务器端处理。将HTML控件转换为HTML服务器控件,只需要简单的添加runat="server"属性,另外可能你还会添加id属性,这样可以通过编程方式访问和控制控件,例如,下面从一个简单的输入控件开始:
<input type="text" size="40">
你可以添加id和runat属性,将它转换为HTML服务器控件,如下所示:
<input type="text" id="BookTitle" size="40" runat="server">
基于以下两个主要原因,可选择使用HTML服务器控件,而不是ASP.NET服务器控件:
转换现有的HTML页
为了在ASP.NET下运行转换的现有的HTML页面,你需要将文件的扩展名修改为.aspx,然而,HTML控件只能运行在客户端,而不是服务器端,为了获得如自动维护状态等服务器端处理的优势,必须为控件添加runat属性。
使用HTML表格实现页面布局
服务器端控件消耗服务器资源,通常,页面使用静态表格实现布局,触发要引用一个或多个表格元素,否则,无须进行服务器端处理。任何HTML控件加上runat=“server”属性,都可以转换为服务器端处理,所有容器控件,都允许通过编程方式访问控件内部的HTML。
客户端处理[ ]
ASP.NET的核心是服务器端处理,然而,这种方式存在一些缺点,主要问题是:任何处理开始之前,都必须回传到服务器,甚至对于通过本地高速网络连接到服务器的Internet应用程序,也是如此,这将常常给用户带来显而易见的,无法接受的延迟体验,对于那些经过高速宽带连接的Internet应用程序而言,这种延迟似乎变得更加漫长。
客户端处理可为用户行为提供及时的响应,因此能够显著改善用户体验,它们可以使用诸如JavaScript或者VBScript这样的脚步语言实现,某些ASP.NET服务器控件使用客户端脚本,来提供用户行为响应,而不需要回传到服务器。
从ASP.NET服务器控件调用客户端代码是可能的,另外,ASP.NET服务器控件中的Button控件包含一个OnClientClick属性,该属性允许你指定客户端脚本,并且当按钮被单击是执行脚本,常规的HTML控件和HTML服务器控件包含许多时间,当它们被引发时,则可执行脚本,脚本包含在内容文件的脚本块,或者包含在控件声明的属性内。