页面即对象

  为了更加方便地输出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 来查看

 

posted @ 2016-12-08 08:51  夏风微凉  阅读(196)  评论(0编辑  收藏  举报