• 页面即对象


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

    Hold on, everything is possible.
  • 相关阅读:
    Jboss
    AOP
    Spring AOP原理及拦截器
    深度解析Struts2中ValueStack
    struts2 ValueStack的作用
    理解ValueStack的基本机制
    Strus2中关于ValueStack详解
    struts2中的值栈对象ValueStack
    吴裕雄--天生自然Numpy库学习笔记:NumPy 广播(Broadcast)
    吴裕雄--天生自然Numpy库学习笔记:NumPy 高级索引
  • 原文地址:https://www.cnblogs.com/student-note/p/6143560.html
Copyright © 2020-2023  润新知