快捷搜索:

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("")]

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("LifeCycle Control");

}

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>

输出结果如下:

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

您可能还会对下面的文章感兴趣: