原創|其它|編輯:郝浩|2009-10-16 11:02:26.000|閱讀 755 次
概述:在每一次http的Request和Response周期asp.net web form都會執行一系列被稱為控件生命周期的預定義過程
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在每一次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>
輸出結果如下:
可以看出,我們對事件的實現都已經插入頁面的生命周期內.
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:互聯網