hushuan

复合自定义控件学习笔记《一》

选择基类:

System.Web.UI.Control:适合派生输出HTML之外的内容的控件,比如XML。或者派生不需要很多外观控件的控件,比如,Literal和ContentPlaceHolder控件。

System.Web.UI.WebControls.WebControl:适合派生需要生成可视化HTML元素的控件,因为WebControl类内建对控件外观的支持。

System.Web.UI.WebControls.CompositeControl:CompositeControl是asp.net 2.0中新增的类,它适合派生多个控件合成的复合控件,因为它会自动为子控件创建命名容器,也扩展了对子控件呈现的管理。Login,Wizard等控件都是继承CompositeControl类。

[注:Composite:adj.复合的,合成的]

 

System.web.UI.Control.Render()方法

protected internal virturl void Render(HtmlTextWriter output){}

Render方法有一个参数HtmlTextWriter output,这个HtmlTextWriter 在运行时由调用Render()方法的Asp.net框架提供,这个HtmlTextWriter 基于Asp.net框架运行时创建响应流。所以,可以通过这个HtmlTextWriter往响应流中输出内容。

Render()是怎样被调用的

Render()方法是由控件所在Page调用的。

Page:IHttpHandler-->ProcessRequest()-->维护状态,处理回传数据,处理事件等等-->而最后一个环节是基于HttpContext中的Response.Output流创建HtmlTextWriter,并调用Page从Control类那里继承来的RenderControl()方法把页面内容发送给请求者。

另一方面,Page间接继承自Control类,Control类的RenderControl方法的默认逻辑为判断Control.Visible属性,如果为true,则调用Control.Render()方法,Render()方法的默认逻辑为生成自己的内容和调用RenderChildren()方法触发所有子控件的生成行为,而子控件也将按照同样的顺序依次调用RenderControl(), Render(),并调用RenderChildren()方法触发子控件的子控件的生成行为,如此一级级递归下去,就使得控件树得以全部生成。

RenderControl()--->Render()--->RenderChildren()--->RenderControl()-->Render()--->RenderChildren()

Render()

{

  --><div..

RenderChildren()---->Render(){--><div..RenderChildren()---></div>} 依次循环 递归生成控件树(HTML)

 ---></div>

}

任何一个Control,包括Page,都可调用其RenderControl()方法呈现它本身的内容和呈现一级级子控件的内容,而不必担心它有无子控件,有多少个子控件,子控件是什么类型等问题,这种以一致接口呈现的设计其实是运用Composite设计模式的一个典型案例。

 

分类:

技术点:

相关文章:

  • 2019-09-17
  • 2021-04-01
  • 2021-08-31
  • 2018-11-26
  • 2021-11-16
  • 2021-04-21
  • 2021-11-19
  • 2021-04-24
猜你喜欢
  • 2020-06-23
  • 2021-07-12
  • 2021-07-28
  • 2021-12-25
  • 2021-08-18
  • 2021-12-04
  • 2021-12-14
相关资源
相似解决方案