Chap 14 ASP.NET服务器控件
--------------------------------------------
1、 ASP.NET服务器控件是指派生于System.Web.UI.WebControls基类的特定控件组
2、 ASP.NET服务器控件是可重复使用的组件,它们可以执行与传统HTML控件相同的任务。可以按照编程方式访问他们,就像其他.NET对象或类一样,可以响应事件,获取/设置属性,执行其他对象能执行的操作
3、 HTML服务器控件对应于HTML标记,在System.Web.UI.HtmlControls名称空间定义,派生于System.Web.UI.HtmlControls.HtmlControl基类
4、 HTML服务器控件提供的各种功能:
(1) 编程方式的对象模型:可按照编程方式访问HTML服务器控件
(2) 事件的处理:事件是在服务器端处理的
(3) 值的自动高速缓存
(4) 数据绑定:可以把数据绑定到HTML服务器控件的一个或多个属性上
(5) 定制属性
(6) 有效性检查:可以使用服务器端有效性检查控件完成原先使用客户端JavaScript脚本完成的校验工作
5、 在程序中可以混合使用HTML服务器控件和ASP.NET服务器控件
6、 用户控件就是用户自己编写的控件,如一个用于输入用户名和密码的控件。这是一组公共的功能,要在Web应用程序的很多页面上重复使用
7、 ASP.NET服务器控件的一些特点:
(1) 多功能对象模型(Rich Object Model):作为一个对象,继承其基类的特性
(2) 自动检测浏览器:ASP.NET服务器控件可以检测客户端浏览器的功能,为客户端浏览器创建相应的HTML和客户端脚本
(3) 属性:所有的ASP.NET服务器控件都共享一组公共的基本属性,以及它们自己的特定于“类”的属性。这些属性允许改变控件的外观甚至行为
(4) 事件:ASP.NET服务器控件可以编写事件处理程序,以编程方式执行逻辑,响应某个ASP.NET服务器控件触发的事件
8、 在设计Web表单的时候,实际上是在引用ASP.NET的Page类的基本功能。Page类为表单提供它自己的方法、属性和事件
9、 在第一次加载Web表单时,可能要预先从数据库中加载Page对象的服务器控件及其值,或者为页面上的每个服务器控件动态设置属性值
10、 页面生命周期的第一部分:Page_Load()方法是一个Page类的虚拟函数,这表示它可以(并且经常)在Page类的执行代码中重写
11、 可以在Page_Load()函数中使用if条件语句,条件为Page.IsPostBack。这个IsPostBack属性是非常重要的,它用于确定页面是否为第一次加载,还是作为“回送”的结果加载的
12、 页面生命周期的第二部分:事件处理阶段。在触发一个事件的时候,并不是所有的控件都执行给服务器的自动回送。可以把控件的AutoPostBack属性设置为True,自动把事件/状态的改变传送回服务器进行处理
13、 Page_Unload()是Page_Load()的对应方法。Page_Unload()方法用于在页面卸载之前执行清空操作。Page_Unload()也是Page类的一个虚拟函数
14、 在服务器端进行用户输入有效性检查的代码示例:Chap14/ rm457_travel.aspx
15、 在这段代码中应注意:
(1) <asp:RequirdFieldValidator>控件是被服务器解释为JS脚本,在客户端执行的!在表单中添加<asp:RequirdFieldValidator>控件,相当于给客户端添加了校验用户必填项的JS代码,只不过不用手工编写JS代码了而已
(2) 如果没有通过“必填区域”的检查,根本不会有数据发送到服务器端(页面不刷新),也就不会到服务器端进行<asp:CustomValidator>控件指定的检查
(3) 在本例中使用了“页面是否经过检验”的标识
(4) 在本例中几处return都是什么作用?答案:对于没有“返回值”的函数,在函数体中编写return关键字,说明在执行完return代码前面的一小部分功能后,(如果符合某些条件)就停止执行此函数体,return后面的函数代码部分就不再被执行了!
(5) DateTime.Parse()方法可以理解为校验用户输入日期格式的有效性
(6) 注意两个服务器端事件处理函数的执行顺序!先执行的是校验的部分!
16、 ASP.NET服务器控件可分为4个系列:内部控件、有效性检查控件、多功能控件和数据显示控件
17、 内部控件,如button和label等
18、 有效性检查控件,如CustomValidator和RequiredFieldValidator等。开发人员不必为网页编写客户端的有效性检查代码
19、 多功能控件,如Calendar等。这些控件一般由两个或多个内部控件组成
20、 数据显示控件,如DataGrid等。
21、 综合应用的代码示例一:Chap14/rm473_MyCalendar.aspx
22、 在这段代码中应注意:
(1) 存在两方面的问题:
(2) 第一是程序结构设计的问题,包括规划各个函数和类。结构设计的原则是什么?首先必须对程序需要完成的功能非常明确,然后根据功能将程序划分为几大部分
(3) 从现在来看,1-从数据源提取数据到DataSet的过程将肯定会被各个程序都划分为一个单独的函数;2-还有,DataSet中虚拟数据表的每行(每条记录)是否都可以作为一个类,这个类实例化为对象后,将此记录的各个字段作为属性赋值给这个对象?3-存在一些完成辅助功能的函数,如此例中的GetSafeDate()函数;4-与B/S程序相关的页面Page_Load()函数,要根据需要确定完成什么功能;5-可将完成程序功能的一个主要对象(本例是Calendar服务器控件)考虑为“主线”,围绕此对象需要实现的功能设计函数和定义类
(4) 第二是编码语法的问题,相信这是一个熟练的过程。注意积累!
(5) 在本例中新接触到的语法点有以下几个:
(6) 事件处理函数的参数部分,有的是EventArgs e,而有的是DateRenderEventArgs e,这些一共有多少种类?都在什么时候使用?
(7) 用Session(Session中存有DataSet类型的变量)给DataSet类型的变量赋值的时候,还要对Session执行一个显式的类型转换?而用DataSet类型的变量给Session赋值的时候却不用?
(8) Calendar服务器控件提供的一系列可编程属性
(9) 将所有数据源的数据读取到DataSet中的时候,按照一定的规则或用户要求(此例是“时间相同”)筛选出一定的数据条目(使用foreach筛选),再显示这些条目的时候,需要建立条目的类,然后将符合要求的条目添加到一个数组列表控件当中,将显示这些符合要求内容的数据显示控件的数据源绑定为这个数组列表控件
(10) GetSafeDate()函数中DateTime.Parse()函数中的参数内容是什么意思?
(11) 注意Repeater服务器控件的模板建立过程,以及在各字段(<td>)中显示对应字段内容的方式
(12) 下面开始是教材上对于此段代码的重点提示
(13) 在Calendar服务器控件中,SelectedDate用于设置日历第一次打开时的默认日期;VisibleDate用于设置可视的日历月份
(14) 给Calendar控件中一个特定Cell显示数据的机制:迭代DataSet中的每一行,与Calendar控件中特定Cell的日期相比较,如果相同则将此行事件的简介赋值给一个label对象,添加到Cell中进行显示。迭代每行,找到所有合适的“记录行”,每一个行都分别赋予一个label对象,添加到Cell中
(15) 创建“事件类”与面向对象的设计有关。将此类的对象都添加到一个ArrayList中,将此ArrayList作为Repeater的数据源。但要注意,这里被填充的ArrayList中只包含被选中的“一天”的所有事件列表,而绝不是所有天的事件!!
23、 ASP.NET最强大的一个功能是模板化的结构,它可以根据用户的动作(目的)定义(动态显示)不同的控件。对于DataGrid和DataList可以使用EditItemTemplate技术,在用户要编辑某些数据时,自动显示不同的控件
24、 综合应用的代码示例二:Chap14/ rm486_edittemplate.aspx
25、 在这段代码中应注意:
(1) 本例中的函数规划是很典型的,按照功能划分函数的例子
(2) 本例中重新EventData.DataSource=LoadMyCalendarData()和EventData.DataBind();出现有两种情况,一是在进行“更新”或“删除”操作的时候,对原始XML文件进行了修改,理所应当重新将新XML文件内容读取到Session中;还有一种情况是在“取消操作”和“开始编辑”的时候,并没有对数据源做修改,为什么还要重新读取???
(3) 将AutoGenerateColumns属性设置为false是很重要的,这意味着通知DataGrid不要自动生成任何列。如果不设置这个属性,DataGrid会按照DataSet数据源中虚拟表的格式,完全重复地显示出一张数据表
(4) DataGrid能够理解在linkbutton控件中定义的Update、Delete等命令,并根据这些命令去执行相应的事件处理程序!
(5) 在自定义显示列的时候,需要制定DataSet中的哪个“字段(列)”显示在自定义的DataGrid的哪个“列”当中!为此,必须引用Container,因为数据存储在这里。在本例中,Container就是DataGrid绑定的DataSet
(6) 在编辑某一行时,每个“列”定义时候的EditItemTemplate开始生效,ASP.NET会自动为选中的行显示EditItemTemplate
(7) 对于DataGrid上的EditItemIndex属性,只要把这个属性设置为某一行号,该行的EditItemTemplate就会替代ItemTemplate显示。事件函数的参数为事件处理函数传递了要处理的行号(索引号)。将EditItemIndex属性设置为-1可以退出编辑模式
(8) 在更新数据的时候,首先要读取出DataGrid中某一字段(TextBox)更新后的内容。在确定某一个字段的时候,需要使用FindControl()方法,因为在ASP.NET服务器控件进行解释后发送给浏览器时,会自动生成一个名称(像“txtDetailDesc”就被解释成了“EventData:_ctl9:txtDetailDesc”),我们并不知道这个名称的其他部分是什么,所以必须使用FindControl()方法