为了更加方便地输出HTML字符,在System.Web.UI命名空间下,还定义了一系列专门输出HTML字符的字符流.这些字符流的基类为TextWriter
XhtmlTextWriter
我们可以通过这个流对象方法对象的HTML标签
因为万物皆对象,所有在ASP.NET中也有控件对应的类Control
运用面向对象的多态,我们可以让改变的部分在之类中去实现,只需要重写就OK了
既然有动态的对象,那么就对应有静态的内容,在ASP.NET中对应的是Literal类不使用任何标记进行说明
那如何来实现HTML document的树形结构?
由于这是一个部分对整体的问题,所有我们可以用组合模式来解决这个问题
那么什么是组合模式?请看[博客地址]
在ASP.NET中使用Control的Controls属性来包含子元素!!!
那么怎么显示?
简单的方法就是定义一个通用的接口,然后一层一层的调用这个接口方法
那现在既然有了控件,就必须有一个东西来标识它,在ASP.NET中使用了和HTML同样的属性--->Id
那么现在问题就来了,因为ASP.NET中有模板这个东西,而你在设置模板的时候只是关注的一项,也就是只设置了一次ID,
那么是不是就是出现Id重复的问题!!!!!!,而ASP.NET的解决方法就是....
让每个控件实现INamingContainer接口,自动生成一个ID,生成的ID的组成如下
父控件 ID 分隔符号 序列号 分隔符号 模板中控件ID
那我们可不可以自定义一个生成ID的模式?
在ASP.NET中可以通过设置CilentIDMode
>Inherit 继承夫控件的生成机制
>AutoID 客户端ID
>Predictable 可预见的
>Static 与服务器端指定ID相同
在ListView 中可以通过设置 ClientIDRowSuffix来确定生成ID的格式............
既然有了控件,那我们就来看看ASP.NET中实现了哪些控件
>Control
>TemplateControl
>Page
>UserControl
>WebControl
>HtmlControl
>CompositeControl
>Panel
>Part
>WebPart
从这个简单的结构图我们就可以得知,Page和UserControl是根据模板生成的!!!!
WebControl Render分为了3个部分
RenderBeginTag 呈现开始标记
RenderContents 呈现内容部分
RenderEndTag 呈现结束标记
在实际中需要重写TageName属性来指定控件生成的标记名称
生成和回发
IAttributeAccessor 实现这个接口就可以动态添加属性
IPostBackDataHandler 需要从回发的请求生成的对象中获取参数
{
bool LoadPostData(string postDataKey,NameValueCollection postCollection);
void RaisePostDataChangedEvent();
}如果空间的状态因为回发的参数发生改变,则返回真,否则,返回假.
控件获取请求参数的操作在页面事件的InitComplete事件之后,PreLoad事件之前
IPostBackEventHandler 回发服务器端事件 实现了这个接口就代表可以触发事件
,具体的做法就是和回发时候的UniqueID进行匹配,如果匹配成功那么就调用它的事件
{
void RaisePostBackEvent(string eventArgument)
}所有控件的事件将在页面的Load事件之后,LoadComplete事件之前被触发
页面对象
所有控件 最终由Page控件组合成一个页面对象
页面是通过partial(部分类)来实现的,因为我们需要在不修改原来代码的情况下拓展类;
因为我们需要使用到模板来减轻我们的编程强度
页面的事件处理管道
页面对象的ProcessRequest方法将启动一个事件处理管道,在这个管道中,页面对象依次完成请求的处理任务.
并向用户提供扩展入口点
1.PreInit 准备开始初始化,此时模板中定义的控件已经创建,准备初始化页面对象,以及初始化自定义控件.
在页面编程中,针对页面主题的设置,必须在这个事件中进行
2.Init 页面对象初始化事件
3.InitComplete 页面对象初始化完成.此时,页面对象已经准备好,页面对象在这个时间点将会做下面几个重要操作.
1.检查是否工作在回发模式下,如果是,从请求参数中提取出视图状态数据,此时间点后,就可以在页面中读取上次保存的ViewState了
2.从视图状态中取得上次页面中控件的状态,重新还原到页面控件属性上,实现页面状态的回复
3.检查请求参数,根据请求的名称和页面控件的ID,页面对象将会把请求参数赋值到控件对应的属性上,以方便用户对请求参数的访问
4.检查并登记控件的事件
4.PreLoad 准备对页面对象中的控件进行操作
5.Load 最常用的事件,可以在此为页面添加一些动态控件,此时,整个页面对象已经准备好,页面对象将再次检查页面中动态添加的控件
并检查请求参数中是否有匹配的参数,以及需要触发的事件,随后,页面对象 进行页面请求参数的验证,并设置页面对象的IsValid属性
6.控件事件,控件的各种事件在这个时间点触发
7.LoadComplete 页面加载阶段完成
8.PreRender,准备生成页面.对于异步页面来说,此时前面的线程已经完成,将在无线程参与的情况下进行异步处理,直到异步处理完成
9.PreRenderComplete 准备生成完成,异步页面的异步请求也已经完成
10.SaveStateComplete 保存页面的状态,以备下次请求的时候用来恢复状态.
11.Unload 进行页面处理的收尾工作,由于页面已经生成,所以,不能再修改控件的属性了
可以通过设置 Trace=true 来查看