Asp.net控件开发学习笔记(十)----服务器控件生命周期

简介:
在每一次http的Request和Response周期asp.net web form都会执行一系列被称为控件生命周期的预定义过程



    
    在第一次通过HTTP Get方法获取到页面后,每一次向服务端进行HTTP POST回传都会分为以下几个步骤:

1.      初始化控件树
2.       将回传的ViewState进行解析
3.      根据前几次的回传解析来为控件树中的每一个控件设置状态
4.      处理回传数据
5.      处理Page_Load事件
6.      通过PostBack通知控件的数据变化,并在必要的情况下更新控件状态
7.      执行基于控件状态改变的服务端事件(比如button的点击)
8.      将控件状态持久化为ViewState
9.      按照次序Render控件树中的每一个控件
10. Dispose整个页面和控件树
 

   由上面的列表可以看出整个的用户Request和服务器Response的周期,首先是将状态解析并根据控件的状态来处理状态的改变,最后处理完后将这些Render回客户端,并将新的状态以ViewState的形式保存在客户端的hidden form中。

 

 

  页面生命周期对应事件

  在页面生命周期中,上面所说的每一个步骤都有一个对应的事件。这也就意味着你可以通过Override事件的执行方法来在页面周期中插入你自己的实现

  

服务端事件

页面生命周期

描述

Init

Initialization

初始化控件树

LoadViewState

Unpack ViewState

从ViewState里提取出状态信息

LoadControlState

Unpack control state

从控件状态中提取出状态信息

LoadPostData

Handle form postback

从PostBack信息中更新控件状态信息

Load

Page_Load event

执行Page_Load内的事件

TrackViewState

Track ViewState

 

RaisePostDataChangedEvent

Initialization for

server-side events

通知控件回传的状态将改变其值

RaisePostBackEvent

Execute server-side events

对于指定的控件,如果状态信息改变,则引发该事件

PreRender

Render process

让每个空间接收最新的状态信息

SaveViewState

Save ViewState

保存ViewState

SaveControlState

Save control state

 

Render

Render process

Render标准HTML,Render的HTML带有控件的状态信息

Dispose

Dispose of control tree

释放资源

 

服务器生命周期和HTTP GET以及HTTP POST

   在System.Web.UI.Control基类定义了OnInit, OnLoad, OnPreRender, OnUnload,这四个事件可以被重写。而对于Dispose事件虽然Control也有定义,但并没有相应的OnDispose方法来引发事件,如果需要Dispose事件,需要实现IDispose接口。

   在通常情况下,第一次访问aspx页面时通过HTTP GET方法,而第二次以后都会通过HTTP POST方法,而HTTP POST方式进行访问服务器时,所需要经历的过程要比GET方式多,因为它包含了数据回传处理,下面是示意图:

   

 

   下面通过一个小Demo来查看控件的生命周期:

Demo Post回传生命周期

 

 首先先写一个控件,对每个控件的上述事件进行覆盖,最后通过在页面Trace来查看

 

   首先是控件的代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

 

namespace Life

{

    [ToolboxData("<{0}:lifecycle runat=server></{0}:lifecycle>")]

    public class Lifecycle : Control, IPostBackEventHandler, IPostBackDataHandler

    {

        protected override void OnInit(System.EventArgs e)

        {

            Trace("Lifecycle: Init Event.");

            base.OnInit(e);

        }

        protected override void TrackViewState()

        {

            Trace("Lifecycle: Track ViewState.");

            base.TrackViewState();

        }

        protected override void LoadViewState(object savedState)

        {

            Trace("Lifecycle: Load ViewState Event.");

            base.LoadViewState(savedState);

        }

        protected override void LoadControlState(object savedState)

        {

            Trace("Lifecycle: Load ControlState Event.");

            base.LoadControlState(savedState);

        }

        public override void DataBind()

        {

            Trace("Lifecycle: DataBind Event.");

            base.DataBind();

        }

        public bool LoadPostData(string postDataKey,NameValueCollection postCollection)

        {

            Trace("Lifecycle: Load PostBack Data Event.");

            Page.RegisterRequiresRaiseEvent(this);

            return true;

        }

        protected override void OnLoad(System.EventArgs e)

        {

            Trace("Lifecycle: Load Event.");

            base.OnLoad(e);

        }

        public void RaisePostDataChangedEvent()

        {

            Trace("Lifecycle: Post Data Changed Event.");

        }

        public void RaisePostBackEvent(string argument)

        {

            Trace("Lifecycle: PostBack Event.");

        }

        protected override void OnPreRender(System.EventArgs e)

        {

            Trace("Lifecycle: PreRender Event.");

            Page.RegisterRequiresPostBack(this);

            base.OnPreRender(e);

        }

        protected override object SaveViewState()

        {

            Trace("Lifecycle: Save ViewState.");

            return base.SaveViewState();

        }

        protected override object SaveControlState()

        {

            Trace("Lifecycle: Save ControlState.");

            return base.SaveControlState();

        }

        protected override void Render(HtmlTextWriter writer)

        {

            base.Render(writer);

            Trace("Lifecycle: Render Event.");

            writer.Write("<h3>LifeCycle Control</h3>");

        }

        protected override void OnUnload(System.EventArgs e)

        {

            Trace("Lifecycle: Unload Event.");

            base.OnUnload(e);

        }

        public override void Dispose()

        {

            Trace("Lifecycle: Dispose Event.");

            base.Dispose();

        }

        private void Trace(string info)

        {

            if (Context != null)

            {

                Context.Trace.Warn(info);

               System.Diagnostics.Debug.WriteLine(info);

            }

        }

    }

}

首先通过设置私有的Trace方法将Trace信息添加进页面当中,通过实现了IPostBackEventHandler和IPostBackDataHandler接口来实现Post方式回传所需要的几个方法。

 控件在前台的代码如下:

 首先在前台将Trace属性设置成True,其次注册控件

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default10.aspx.cs" Inherits="Default10" Trace="true" %>

<%@ Register Namespace="Life" TagPrefix="lc" %>

 

然后将控件放在页面内:

<lc:Lifecycle runat="server"></lc:Lifecycle>

输出结果如下:

  


   可以看出,我们对事件的实现都已经插入页面的生命周期内.



本文转自CareySon博客园博客,原文链接:http://www.cnblogs.com/CareySon/archive/2009/10/15/1584106.html,如需转载请自行联系原作者
相关文章
|
2天前
|
存储 前端开发 数据处理
c++游戏服务器开发
c++游戏服务器开发
10 2
|
14天前
|
SQL 开发框架 前端开发
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
21 0
|
18天前
|
网络协议 IDE 网络安全
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
36 0
|
18天前
|
Ubuntu 网络协议 Linux
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
19 0
|
26天前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
20 0
|
26天前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
19 0
|
26天前
|
SQL 开发框架 JavaScript
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
13 0
|
1月前
|
缓存 网络协议 Linux
Linux C/C++ 开发(学习笔记十三):百万并发的服务器实现
Linux C/C++ 开发(学习笔记十三):百万并发的服务器实现
30 0
|
1月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
32 0
|
1月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
26 0

相关产品

  • 云迁移中心