今天你写控件了吗?----ASP.net控件开发系列之(二)

 生死有序”
“装装孙子”
 上篇文章《开篇》说了不少空洞的理论,这篇文章我还是先说说“大而化之”的东西:1、ASP.net控件(包括页面本身)的生命期的细节;2、如何开始一个控件的编写。
“生死有序”
 ASP.net处理程序在接收到一个用户的页面请求后,它是如何变戏法把一个鲜活的页面呈现给客户端的呢?它都做了哪些事?按什么顺序做的?
 要说明这个问题,我们首先要明白,一个页面它本身也是一个Control。从设计模式的角度讲,页面模型是一个“合成模式(Composite)”,它本身是一棵由多层控件组成的结构树,顶层是Page,以下有叶有树枝,叶是不再包涵子控件的控件,枝是又包涵子控件的控件,每一层控件的生成都会调用一个生成子控件的方法,父控件调用子控件的生成方法,子又调用孙的,如此递归,保证页面中所有有效的(一般情况下是Visible=true)控件都得到生成过程处理,(有关设计模式的东西大家可以查看吕震宇老师在博客园的设计模式系列文章,该系列文章是对阎博士《Java与模式》一书(88元,很厚)的提炼与加工,至少可用来做设计模式浅层面速成的教材),而每个控件在生命周期大体都包括以下几个步骤:



1.实例化(Instantiate)
我们写控件一般不要接触此活动。
2.初始化(Initialize)
同上。
3.跟踪视图(Tracking View State)*
这个比较重要,涉及到视图状态,一般情况下不必重载此方法。
4.加载视图状态(Load view state)*
只会在回传过程中调用此方法,用法同上。
5.加载回传数据(Load postback data)*
如果你的控件生成之后要和客户端交互,那么这个方法就很重要,只会在回传过程中调用此方法。
6.开始载入(Load)
这个活动一般只是Page的OnLoad才会要去管它,我们写控件一般不要接触此方法。
7.有修改(Raise changed events)*
控件生成后,数据被客户端更改过,和加载回传数据是一路的。
8.回传事件处理(Raise postback event)*
一般用于实现IPostBackEventHandler接口的控件的把客户端事件转化成服务器端事件。只用于回传过程。
9.生成预处理(PerRender)**
生成前期工作,这个是很重要的一个过程,通过重载OnPreRender方法实现自定义。
10.保存视图状态(Save view state)*
如果所以信息都是用ViewState[xxx]这种方式来保存,不必重载,只有自定义视图状态管理时才重载此方法,当然,这里做了手脚,LoadViewState也就一定要和这里的Save方法配套。
11.生成(Render)***
这个是主角,控件成生什么东东基本就由这里管了。
12.卸载(Unload)
13.释放(Dispose)
了解控件的生命周期的细节对于我们自定义控件的各个部分以及调试控件,排除控件Bug都是至关重要的。
当然这此过程中有些活动是我们要特别重视的,我在这些活动的后面加了*号。
“装装孙子”
 还记得我在上一篇文章中说.net框架已经为我们做了大部分的事情吗?确实,我们写一个控件不是平地起高楼,我们已经有了很多成品和半成品了。很多情况下,为了快速开发一个控件,你甚至可以使自己的控件直接继承于TextBox、Button之类具体的控件,略做修改,就可实现自己的功能。如果没有这样的好事,那你也最好考虑从以下两个类继承:System.Web.UI.Control、System.Web.UI.WebControls.WebControl,第一个类适合于派生生成不是可视HTML对象的控件,如生成<meta><xml>之类内容的控件,第二个类适合于生成各种HTML对象,它已经实现了基本的样式管理、HTML标签生成等等功能。

下一篇打算和大家探讨一下控件属性的方方面面,包括属性与HTML样式的aspx文件文本的关系,属性在VS中的高级编辑方法和在IDE中各种交互方式的定制等等。

posted @ 2005-05-08 09:00 THIN 阅读(9363) 评论(18)   编辑 收藏 所属分类: ASP.net server components and controls

   回复   引用   查看     
#1楼  2005-05-08 09:33 | 林和少       
老兄,写得不错,但希望你有些东西还是不要略过,也要提一下,比如:
1.实例化(Instantiate)
我们写控件一般不要接触此活动。
还要加一点说明,让读者知道这一过程主要是做了些什么。
   回复   引用   查看     
#2楼  [ 楼主]2005-05-08 09:39 | 仁渣       
实例化指TextBox tb = new TextBox();这样的语句,CLR会在堆中分配内存空间,初始化内存状态之类的事情,这个阶段你一般不用做什么。
   回复   引用   查看     
#3楼  [ 楼主]2005-05-08 09:41 | 仁渣       
对于以上提到的各个阶段,本篇文章只是一个概览,像数据回传,视图状态管理、生成这些内容,在后续文章中我会一一以个人的粗鄙认识做一个详细说明。
   回复   引用     
#4楼  2005-05-08 11:42 | 木鱼。NET [未注册用户]
控件开发关联的东西很多,希望老兄讲解时内容安排好,一步一步有序地讲解!
特别是前面的理论知识,要讲清楚,这样我们后面才能更加清楚理解啊!
   回复   引用   查看     
#5楼  [ 楼主]2005-05-08 12:24 | 仁渣       
谢谢你的意见,我会注意这些的,我想还是用先总后分的步骤吧。
   回复   引用     
#6楼  2005-05-08 13:10 | 極速麻醉 [未注册用户]
寫的很好!對我這初學都很有幫助!等這幾天才看到下篇。希望樓主有時間可以多寫寫這樣的文章!也非常感謝樓主這種精神!
期待這下一篇!
   回复   引用     
#7楼  2005-06-16 12:28 | dkhero [未注册用户]
各位老兄辛苦了,在下刚接触到自定义控件的开发,看了你们的评论让我豁然开朗。向各位大牛致敬!
   回复   引用   查看     
#8楼  2005-09-13 14:29 | 愚工移山       
希望详细点

   回复   引用     
#9楼  2007-05-13 21:21 | Kaoz [未注册用户]
我有时候也重写 onInit事件, 比如带有特定项的DropDownList等,我就在onInit事件把这些项Add进去,不知道这样是不是合理?
   回复   引用     
#10楼  2007-07-31 21:11 | allen [未注册用户]
写的不错,
   回复   引用     
#11楼  2007-07-31 21:11 | allen [未注册用户]
写的不错,学写.NET控件,从你的BLOG开始.
   回复   引用     
#12楼  2007-11-03 17:29 | 初学者2007 [未注册用户]
请问楼主
我用继承dropdownlist的方法做了一个控件,但是在往这个控件里加ListItem的时候,ListItem下面会出现红色的波浪线,aspx文件的编译也会出错。这是为什么啊?
下面是我写的程序。

-.aspx---------------------------------
<fcc:CustomDropDownList id="CustomDropDownList1" runat="server" Width="184px" Height="24px">
<asp:ListItem value="" ></asp:ListItem>
<asp:ListItem value="1">Item1</asp:ListItem>
<asp:ListItem value="2">Item2</asp:ListItem>
</fcc:CustomDropDownList>
---------------------------------------
初次写控件,还望多多指教。
   回复   引用   查看     
#13楼  [ 楼主]2007-11-03 19:19 | THIN       
@初学者2007
提供代码不完整,出错信息也没有提供,不能分析
   回复   引用     
#14楼  2007-11-03 20:49 | 初学者2007 [未注册用户]
不好意思,没有说清楚。
原来只是想重写AddAttributesToRender函数,但是还没重写这个函数,光继承
dropdownlist的时候(别的什么都没写)就出了这个错。
[
DefaultEvent("SelectedIndexChanged"),
ToolboxData("<{0}:CustomDropDownList runat=server></{0}:CustomDropDownList>")
]
public class CustomDropDownList : System.Web.UI.WebControls.DropDownList, IForestContorl
{
public CustomDropDownList()
{
SelectedIndex = 0;
}
}

还有就是运行程序的时候一切都正常,就是那个波浪线看起来很讨厌。
   回复   引用   查看     
#15楼  [ 楼主]2007-11-03 21:16 | THIN       
@初学者2007
如果是IDE在编辑时出现提示,而不出错的话,那么则不必过于担心。IDE的智能感知是由Schema提供的
   回复   引用     
#16楼  2007-11-03 21:59 | 初学者2007 [未注册用户]
谢谢楼主。以后还请多多指教。
   回复   引用     
#17楼  2007-11-04 11:02 | 初学者2007 [未注册用户]
不好意思再次劳烦楼主

请问除了在工具菜单里取消掉HTML的验证错误显示的方法以外,有没有办法去掉这个讨厌的波浪线啊?
   回复   引用   查看     
#18楼  [ 楼主] 2007-11-04 11:37 | THIN       
--引用--------------------------------------------------
初学者2007: 不好意思再次劳烦楼主

请问除了在工具菜单里取消掉HTML的验证错误显示的方法以外,有没有办法去掉这个讨厌的波浪线啊?
--------------------------------------------------------

按理说,ASP.NET控件的智能感知信息是自动获得的,但出现你遇到的这种情况,可能涉及到修改Schema文件,IDe的智能感知也是根据XML 的Schema提供的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值