第一篇:初识ASP.NET控件开发_第三节:“生死有序”的控件生命周期

一、Page本质是一个Control

我们首先要澄清的第一个概念是页面类Page本质是一个控件类,它派生于TemplateControl类,而TemplateControl派生自Control类。既然饭我没有乱吃,自然话也不会乱讲。借田有良老师的翠花给大家上证据如下:

二、Control的“生死之序”

  • 1.实例化(Instantiate)
    我们写控件一般不要接触此活动。

  • 2.初始化(Initialize)
    【初始化自己,创建它的子控件(但该过程控件的状态没有加载)。触发该控件的OnInit()事件。】我们写控件一般不要接触此活动。
    【跟踪视图状态(Tracking View State)*  】这个比较重要,涉及到视图状态,一般情况下不必重载此方法。
  • 3.加载视图状态(Load view state)*
    只会在回传过程中调用此方法,用法同上。
  • 4.加载回发数据(Load postback data)*
    如果你的控件生成之后要和客户端交互,那么这个方法就很重要,只会在回传过程中调用此方法。
  • 5.加载(Load)
    这个活动一般只是Page的OnLoad才会要去管它,我们写控件一般不要接触此方法。
  • 6.更改通知(Raise changed events)*
    控件生成后,数据被客户端更改过,和加载回传数据是一路的。
  • 7.处理回发事件(Raise postback event)*
    一般用于实现IPostBackEventHandler接口的控件的把客户端事件转化成服务器端事件。只用于回传过程。
  • 8.预呈现(PerRender)**
    生成前期工作,这个是很重要的一个过程,通过重载OnPreRender方法实现自定义。
  • 9.保存视图状态(Save view state)*
    如果所以信息都是用ViewState[xxx]这种方式来保存,不必重载,只有自定义视图状态管理时才重载此方法,当然,这里做了手脚,LoadViewState也就一定要和这里的Save方法配套。
  • 10.呈现(Render)***
    这个是主角,控件成生什么东东基本就由这里管了。
  • 11.卸载(Unload)
  • 12.释放(Dispose)

三、控件树的“合成模式(Composite)”

从设计模式的角度讲,页面模型是一个“合成模式(Composite)”,它本身是一棵由多层控件组成的结构树,顶层是Page,以下有叶有树枝,叶是不再包涵子控件的控件,枝是又包涵子控件的控件,每一层控件的"初始化\加载视图状态\加载\预呈现\保存视图状态\卸载"等方法都会调用子控件的对应方法,父控件调用子控件的方法,子又调用孙的,如此递归。

1、初始化:

internal virtual void InitRecursive(Control namingContainer)
{

    this.ResolveAdapter();

    if (this._controls != null)

    {

        if (this.flags[128])

        {

            namingContainer = this;

        }

        string collectionReadOnly = this._controls.SetCollectionReadOnly("Parent_collections_readonly");

        int count = this._controls.Count;

        for (int i = 0; i < count; i++)

        {

            Control control = this._controls[i];

            control.UpdateNamingContainer(namingContainer);

            if (control._id == null && namingContainer != null && !control.flags[64])

            {

                control.GenerateAutomaticID();

            }

            control._page = this.Page;

            control.InitRecursive(namingContainer);

        }

        this._controls.SetCollectionReadOnly(collectionReadOnly);

    }

    if (this._controlState < ControlState.Initialized)

    {

        this._controlState = ControlState.ChildrenInitialized;

        if (this.Page != null && !this.DesignMode && this.Page.ContainsTheme && this.EnableTheming)

        {

            this.ApplySkin(this.Page);

        }

        if (this.AdapterInternal != null)

        {

            this.AdapterInternal.OnInit(EventArgs.Empty);

        }

        else

        {

            this.OnInit(EventArgs.Empty);

        }

        this._controlState = ControlState.Initialized;

    }

    this.TrackViewState();

}

2、加载视图状态:

internal void LoadViewStateRecursive(object savedState)
{

    if (savedState == null || this.flags[4])

    {

        return;

    }

    if (this.Page != null && this.Page.IsPostBack)

    {

        object obj = null;

        Pair pair = savedState as Pair;

        object first;

        ArrayList arrayList;

        if (pair != null)

        {

            first = pair.First;

            arrayList = (ArrayList)pair.Second;

        }

        else

        {

            Triplet triplet = (Triplet)savedState;

            first = triplet.First;

            obj = triplet.Second;

            arrayList = (ArrayList)triplet.Third;

        }

        try

        {

            if (obj != null && this.AdapterInternal != null)

            {

                this.AdapterInternal.LoadAdapterViewState(obj);

            }

            if (first != null)

            {

                this.LoadViewState(first);

            }

            if (arrayList != null)

            {

                if (this.LoadViewStateByID)

                {

                    this.LoadChildViewStateByID(arrayList);

                }

                else

                {

                    this.LoadChildViewStateByIndex(arrayList);

                }

            }

        }

        catch (InvalidCastException)

        {

            throw new HttpException(SR.GetString("Controls_Cant_Change_Between_Posts"));

        }

        catch (IndexOutOfRangeException)

        {

            throw new HttpException(SR.GetString("Controls_Cant_Change_Between_Posts"));

        }

    }

    this._controlState = ControlState.ViewStateLoaded;

}

internal void LoadChildViewStateByID(ArrayList childState)

{

    int count = childState.Count;

    for (int i = 0; i < count; i += 2)

    {

        string text = (string)childState[i];

        object obj = childState[i + 1];

        Control control = this.FindControl(text);

        if (control != null)

        {

            control.LoadViewStateRecursive(obj);

        }

        else

        {

            this.EnsureOccasionalFields();

            if (this._occasionalFields.ControlsViewState == null)

            {

                this._occasionalFields.ControlsViewState = new Hashtable();

            }

            this._occasionalFields.ControlsViewState[text] = obj;

        }

    }

}

3、加载:

internal virtual void LoadRecursive()
{

    if (this._controlState < ControlState.Loaded)

    {

        if (this.AdapterInternal != null)

        {

            this.AdapterInternal.OnLoad(EventArgs.Empty);

        }

        else

        {

            this.OnLoad(EventArgs.Empty);

        }

    }

    if (this._controls != null)

    {

        string collectionReadOnly = this._controls.SetCollectionReadOnly("Parent_collections_readonly");

        int count = this._controls.Count;

        for (int i = 0; i < count; i++)

        {

            this._controls[i].LoadRecursive();

        }

        this._controls.SetCollectionReadOnly(collectionReadOnly);

    }

    if (this._controlState < ControlState.Loaded)

    {

        this._controlState = ControlState.Loaded;

    }

}

4、预呈现:

internal virtual void PreRenderRecursiveInternal()
{

    if (!this.Visible)

    {

        this.flags.Set(16);

    }

    else

    {

        this.flags.Clear(16);

        this.EnsureChildControls();

        if (this.AdapterInternal != null)

        {

            this.AdapterInternal.OnPreRender(EventArgs.Empty);

        }

        else

        {

            this.OnPreRender(EventArgs.Empty);

        }

        if (this._controls != null)

        {

            string collectionReadOnly = this._controls.SetCollectionReadOnly("Parent_collections_readonly");

            int count = this._controls.Count;

            for (int i = 0; i < count; i++)

            {

                this._controls[i].PreRenderRecursiveInternal();

            }

            this._controls.SetCollectionReadOnly(collectionReadOnly);

        }

    }

    this._controlState = ControlState.PreRendered;

}

5、保存视图状态:

internal object SaveViewStateRecursive(ViewStateMode inheritedMode)
{

    if (this.flags[4])

    {

        return null;

    }

    bool flag;

    if (this.flags[8388608])

    {

        if (this.flags[16777216])

        {

            flag = true;

            inheritedMode = ViewStateMode.Enabled;

        }

        else

        {

            flag = false;

            inheritedMode = ViewStateMode.Disabled;

        }

    }

    else

    {

        flag = (inheritedMode == ViewStateMode.Enabled);

    }

    object obj = null;

    object obj2 = null;

    if (flag)

    {

        if (this.AdapterInternal != null)

        {

            obj = this.AdapterInternal.SaveAdapterViewState();

        }

        obj2 = this.SaveViewState();

    }

    ArrayList arrayList = null;

    if (this.HasControls())

    {

        ControlCollection controls = this._controls;

        int count = controls.Count;

        bool loadViewStateByID = this.LoadViewStateByID;

        for (int i = 0; i < count; i++)

        {

            Control control = controls[i];

            object obj3 = control.SaveViewStateRecursive(inheritedMode);

            if (obj3 != null)

            {

                if (arrayList == null)

                {

                    arrayList = new ArrayList(count);

                }

                if (loadViewStateByID)

                {

                    control.EnsureID();

                    arrayList.Add(control.ID);

                }

                else

                {

                    arrayList.Add(i);

                }

                arrayList.Add(obj3);

            }

        }

    }

    if (this.AdapterInternal != null)

    {

        if (obj2 != null || obj != null || arrayList != null)

        {

            return new Triplet(obj2, obj, arrayList);

        }

    }

    else

    {

        if (obj2 != null || arrayList != null)

        {

            return new Pair(obj2, arrayList);

        }

    }

    return null;

}

6、卸载:

internal virtual void UnloadRecursive(bool dispose)
{

    Page page = this.Page;

    if (page != null && page.RequiresControlState(this))

    {

        page.UnregisterRequiresControlState(this);

        this.RareFieldsEnsured.RequiredControlState = true;

    }

    if (this.flags[2097152])

    {

        this._id = null;

        this.flags.Clear(2097152);

    }

    if (this._controls != null)

    {

        string collectionReadOnly = this._controls.SetCollectionReadOnly("Parent_collections_readonly");

        int count = this._controls.Count;

        for (int i = 0; i < count; i++)

        {

            this._controls[i].UnloadRecursive(dispose);

        }

        this._controls.SetCollectionReadOnly(collectionReadOnly);

    }

    if (this.AdapterInternal != null)

    {

        this.AdapterInternal.OnUnload(EventArgs.Empty);

    }

    else

    {

        this.OnUnload(EventArgs.Empty);

    }

    if (dispose)

    {

        this.Dispose();

    }

    if (this.IsReloadable)

    {

        this._controlState = ControlState.Constructed;

    }

}

四、InitRecursive、LoadRecursive、PreRenderRecursiveInternal、UnloadRecursive函数看事件的触发顺序

时间: 2024-11-05 02:39:07

第一篇:初识ASP.NET控件开发_第三节:“生死有序”的控件生命周期的相关文章

深入理解javascript对象系列第一篇——初识对象

× 目录 [1]定义 [2]创建 [3]组成[4]引用 前面的话 javascript中的难点是函数.对象和继承,前面已经介绍过函数系列.从本系列开始介绍对象部分,本文是该系列的第一篇——初识对象 对象定义 javascript的基本数据类型包括undefined.null.boolean.string.number和object.对象和其他基本类型值不同的是,对象是一种复合值:它将许多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值 于是,对象也可看做是属性的无序集合,每个属性都是一个

android开发3:四大基本组件的介绍与生命周期

android开发3:四大基本组件的介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器,. 生命周期 是指进程周期 – 创建到结束的过程 进程类别 前台进程:当前正在前台运行的进程 可见进程:显示在前台中,但用户并未在和其进行交互 服务进程:为用户提供服务的进程 后台进程 空进程:该进程一般是为了缓存机制而存在的 组件介绍 Activity(表现层) 应用程序中,一个Act

【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)

目录 [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策略(MVC5+EF6) [第四篇]ASP.NET MVC快速入门之完整示例(MVC5+EF6) 请关注三石的博客:http://cnblogs.com/sanshi 新建项目 打开VS2015,找到菜单项[文件->新建->项目],打开向导对话框: 注意我们的选择项: 1.     运行平台:.NET FrameWork 4.5 2.     项目模板:ASP.NET W

我们一起学习WCF 第一篇初识WCF(附源码供对照学习)

前言:去年由于工作需要我学习了wcf的相关知识,初期对wcf的作用以及为何用怎么样都是一知半解,也许现在也不是非常的清晰.但是通过项目对wcf的运用在脑海里面也算有了初步的模型.今天我就把我从开始wcf所遇到的困难以及解决方案一点点记下来,可能还有很多不足之处那我们一起共同学习.在学习之前我们有必要初步的看下百度百科对wcf的解释,让我们心中有这一个概念,然后建立项目,然后再次看概念,然后在去更深层的建立项目,然后再去理解这样反复的去做我相信可以做好wcf.那么下面我就会从初识wcf,wcf消息

时间:第1周9月16日;主题:初识ASP.NET MVC项目开发(一)

Part I:回顾及提问 ==================== 1. ASP.NET MVC是微软公司.NET平台上的一个______________,它为开发者提供了一种构建结构良好的Web应用程序的方式. 2. 自2007年首次公布预览以来,作为_____________的替代品,ASP.NET MVC的普及度已明显提高,现在很多大型Web应用程序都是使用这一技术构建的. 3. 为了简化软件开发的复杂度,以一种概念简单却又权责分明的架构来贯穿整个软件开发流程,将业务逻辑层与_______

spring之旅第一篇-初识spring

一.概述 只要用框架开发java,一定躲不过spring,Spring是一个轻量级的Java开源框架,存在的目的是用于构建轻量级的J2EE应用.Spring的核心是控制反转(IOC)和面向切面编程(AOP).spring有如下特点: 轻量级:应用大小和应用开支,包括应用方式 DI/IoC:提供松耦合的一种实现技术 AOP:切面编程将业务逻辑从应用服务中分离 容器:包含并管理应用对象的生命周期和配置 框架:使用组件配置组合成复杂的应用,并提供很多基础功能 由于spring是一个容器型的框架,所以它

12、Cocos2dx 3.0游戏开发找小三之3.0中的生命周期分析

重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706303 生命周期分析 在前面文章中我们执行了第一个 Cocos2d-x 游戏,同一时候也介绍了控制游戏生命周期的 AppDelegate 文件. 以下我们将结合一些游戏调试经常使用的技巧以及VS工具调试的方法来分析 Cocos2d-x 程序的生命周期. VS工具调试 1.查看内存窗体 2.查看输出窗体 3.假设程序崩溃查看调用堆栈窗体 打开项目

《Android开发艺术探索》读书笔记之Activity的生命周期

两种不同情况下的Activity生命周期 (1)典型情况下的生命周期 指在有用户参与的情况下,Activity所经过的生命周期的改变. (2)异常情况下的生命周期 指Activity被系统回收或者由于当前设备的Configuration发生改变重而导致Activity被销毁传重建. 看看官方文档的Activity生命周期图 注意以下几点: (1)onstart()和onResume()从实际使用过程来说差不多,但是onstart()的时候Activity虽然可见啦但是还在后台,onResume(

第一篇:初识ASP.NET控件开发_第一节:控件类及其继承关系

1)System.Web.UI.Control(以下简称Control) Control 类是包括自定义控件.用户控件和页在内的所有 ASP.NET 服务器控件的基类..定义由所有 ASP.NET 服务器控件共享的属性.方法和事件. 命名空间:System.Web.UI程序集:System.Web(在 system.web.dll 中) 2)System.Web.UI.WebControls.WebControl(以下简称WebControl) WebControl 类是 System.Web.