上篇文章寫(xiě)到ASP.NET頁(yè)面的生命周期。詳見(jiàn):http://www.cnblogs.com/zhaozhan/archive/2009/06/21/1507740.html。
Page_PreInit事件來(lái)執(zhí)行以下操作:檢查IsPostBack屬性來(lái)確定是不是第一次處理該頁(yè),創(chuàng)建或重新創(chuàng)建動(dòng)態(tài)控件,動(dòng)態(tài)設(shè)置主控頁(yè),動(dòng)態(tài)設(shè)置Theme屬性,讀取或設(shè)置配置文件的屬性值。如果請(qǐng)求回發(fā)請(qǐng)求,則空間的值尚未從視圖狀態(tài)還原,如果在此階段設(shè)置控件屬性,則其值可能在下一時(shí)間中被重寫(xiě)。
Page_Init事件中所有的控件都設(shè)為默認(rèn)的狀態(tài),但此時(shí)視圖狀態(tài)沒(méi)有被恢復(fù)。這意味著Page_Init不應(yīng)該用來(lái)處理服務(wù)器控件的值和狀態(tài)。
InitComplete事件由Page對(duì)象引發(fā)。使用該事件來(lái)處理要求先完成所有初始化工作的任務(wù)。
Page_PreLoad:如果需要在Load事件之前對(duì)頁(yè)或控件執(zhí)行處理使用。在Page引發(fā)該事件后,它會(huì)為自身和所有控件加載視圖狀態(tài),然后會(huì)處理Request實(shí)例包括的任何回發(fā)數(shù)據(jù)。
Page_Load事件是ASP.NET編程中最常用的時(shí)間。它在Page_Init事件之后調(diào)用。Page_Load事件和Page_Init事件之間的主要差別是到觸發(fā)Page_Load事件時(shí)。所有的服務(wù)器空間的視圖狀態(tài)都將被恢復(fù)。這使得該時(shí)間可以很理想地用于操縱空間并準(zhǔn)備頁(yè)面的內(nèi)容,然后再呈現(xiàn)給客戶端。
控件事件在頁(yè)面初始化階段之后進(jìn)行處理。來(lái)處理特定控件的事件,如Button控件的Click事件或TextBox控件的TextChanged事件。在回發(fā)請(qǐng)求中,如果頁(yè)包含驗(yàn)證程序控件,請(qǐng)?jiān)趫?zhí)行任何處理之前Page和各個(gè)驗(yàn)證控件的IsValid屬性。
LoadComplete事件來(lái)處理加載頁(yè)面上的所有其他控件的任務(wù)。
PreRender事件對(duì)頁(yè)或其空間的內(nèi)容進(jìn)行最后的更改。
SaveStateComplete:在該事件發(fā)生前,已針對(duì)頁(yè)和所有控件保存了ViewState。將忽略此時(shí)對(duì)頁(yè)或控件進(jìn)行的任何更改。
使用該事件執(zhí)行滿足以下條件的任務(wù):要求已經(jīng)保存了視圖狀態(tài),但未對(duì)控件進(jìn)行任何更改。
Render:這不是事件;在處理的這個(gè)階段,Page對(duì)象會(huì)在每個(gè)控件上調(diào)用此方法。所有 ASP.NET Web 服務(wù)器控件都有一個(gè)用于寫(xiě)出發(fā)送給瀏覽器的控件標(biāo)記的Render方法。如果創(chuàng)建自定義控件,通常要重寫(xiě)此方法以輸出控件的標(biāo)記。不過(guò),如果自定義控件只合并標(biāo)準(zhǔn)的 ASP.NET Web 服務(wù)器控件,不合并自定義標(biāo)記,則不需要重寫(xiě)Render方法。用戶控件(.ascx 文件)自動(dòng)合并呈現(xiàn),因此不需要在代碼中顯式呈現(xiàn)該控件。
UnLoad事件首先針對(duì)每個(gè)控件發(fā)生,繼而針對(duì)該頁(yè)發(fā)生。在控件中,使用該事件對(duì)特定控件執(zhí)行最后清理,如關(guān)閉控件特定數(shù)據(jù)庫(kù)連接。
對(duì)于頁(yè)自身,使用該事件來(lái)執(zhí)行最后清理工作,如:關(guān)閉打開(kāi)的文件和數(shù)據(jù)庫(kù)連接,或完成日志記錄或其他請(qǐng)求特定任務(wù)。在卸載階段,頁(yè)及其控件已被呈現(xiàn),因此無(wú)法對(duì)響應(yīng)流做進(jìn)一步更改。如果嘗試調(diào)用方法(如Response.Write 方法),則該頁(yè)將引發(fā)異常。
下面做個(gè)簡(jiǎn)單的Demo:
在下面的例子,創(chuàng)建一個(gè)投票的Web窗體,允許用戶投票選擇喜愛(ài)的顏色。
<form id="form1" runat="server"><div style=" color:Maroon; font-size:5; font-weight:bold;"><h2>Vote For Your Favorite Color!</h2><asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" BorderColor="#DEDA84"BorderStyle="None" CellPadding="3" CellSpacing="2" BorderWidth="1px" BackColor="#DEBA84"><SelectedRowStyle Font-Bold="true" ForeColor="White" BackColor="#738A9C" /><RowStyle ForeColor="#8C4510" BorderColor="#FFF7E7" /><HeaderStyle Font-Bold="true" ForeColor="White" BackColor="#A55129"/><FooterStyle ForeColor="#8C4510" BackColor="#F7DFB5" /><Columns><asp:BoundField DataField="Key" HeaderText="Name" /><asp:BoundField DataField="Value" HeaderText="# of Votes" /><asp:ButtonField Text="Vote" ButtonType="Button" HeaderText="Vote" CommandName="Vote" /></Columns></asp:GridView></div><asp:Button ID="btnReset" runat="server" Text="Reset Votes" /></form>
在Page_Load事件中:或者把所有的投票數(shù)設(shè)為初始的零值,或者從應(yīng)用程序的緩存中檢索投票數(shù)。
protected Hashtable VoteTally;protected string[] ColorList = { "Red","Green","Blue","Black","White"};protected void Page_Load(object sender, EventArgs e){VoteTally = new Hashtable();foreach (string strKey in ColorList){if (Cache.Get(strKey) == null)VoteTally.Add(strKey, 0);elseVoteTally.Add(strKey, Cache.Get(strKey));}}
在頁(yè)面卸載時(shí),把這些值緩存起來(lái),是頁(yè)面的所有其他用戶也能投票。
protected void Page_UnLoad(object sender, EventArgs e){foreach (string strKey in ColorList){Cache.Insert(strKey, VoteTally[strKey]);}}
當(dāng)用戶點(diǎn)擊某一行的命令按鈕投票選擇一種顏色時(shí),觸發(fā)RowComand。這是一個(gè)事件起泡(event bubbling),容器控件中的一個(gè)子控件引起容器控件的一個(gè)事件被觸發(fā)。控件事件是在Page_Load事件觸發(fā)之后觸發(fā)的。
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e){if (e.CommandName == "Vote"){int id = Convert.ToInt32(e.CommandArgument);string strKey = GridView1.Rows[id].Cells[0].Text.ToString();VoteTally[strKey] =(int) VoteTally[strKey] + 1;}}
在Page_PreRender事件期間把數(shù)據(jù)源綁定到GridView。在PreRender事件綁定的好處是可以清除兩次綁定數(shù)據(jù)的情況(一次在Page_Load中,一次在RowComand中),通過(guò)把綁定放到Page_PreRender中,只需把綁定數(shù)據(jù)的代碼放到一個(gè)地方,它可以覆蓋所有的情況。
private void Page_PreRender(object sender, EventArgs e){GridView1.DataSource = VoteTally;GridView1.DataBind();}
清除所有的緩存。重新投票計(jì)數(shù)。
protected void btnReset_Click(object sender, EventArgs e){foreach (string strKey in ColorList){VoteTally[strKey] = 0;Cache.Insert(strKey, 0);}}
頁(yè)面的顯示效果如下:
在Global.asax設(shè)置Application_BeginRequest和Application_EndRequest方法。統(tǒng)計(jì)頁(yè)面時(shí)間。
void Application_BeginRequest(object sender, EventArgs e){Application[Request.UserHostAddress.ToString()] = DateTime.Now;}void Application_EndRequest(object sender, EventArgs e){DateTime sTime = (DateTime)Application[Request.UserHostAddress.ToString()];Application.Remove(Request.UserHostAddress.ToString());Response.Write("<hr/>");Response.Write("Total Page Processing Time=");Response.Write((DateTime.Now.Ticks-sTime.Ticks)/1000000.0);Response.Write("Seconds");}
聯(lián)系客服