九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Asp.net2.0頁面執(zhí)行順序

Asp.net2.0頁面執(zhí)行順序

Asp.net2.0頁面執(zhí)行順序
2008-09-12 09:16

Asp.net是微軟.Net戰(zhàn)略的一個(gè)組成部分。它相對(duì)以前的Asp有了很大的發(fā)展,引入了許多的新機(jī)制。本文就Asp.net頁面的生命周期向大家做一個(gè)初步的介紹,以期能起到指導(dǎo)大家更好、更靈活地操縱Asp.net的作用。
當(dāng)一個(gè)獲取網(wǎng)頁的請(qǐng)求(可能是通過用戶提交完成的,也可能是通過超鏈接完成的)被發(fā)送到Web服務(wù)器后,這個(gè)頁面就會(huì)接著運(yùn)行從創(chuàng)建到處理完成的一系列事件。在我們?cè)噲D建立Asp.net頁面的時(shí)候,這個(gè)執(zhí)行周期是不必去考慮的,那樣只會(huì)自討苦吃。然而,如果被正確的操縱,一個(gè)頁面的執(zhí)行周期將是一道有效而且功能強(qiáng)大的工具。許多開發(fā)者在編寫Asp.net的頁面以及用戶控件的時(shí)候發(fā)現(xiàn),如果知道整個(gè)過程中發(fā)生了什么以及在什么時(shí)候發(fā)生將對(duì)完成整個(gè)任務(wù)起到很重要的幫助作用。下面我就向大家介紹一下一個(gè)Asp.net頁面從創(chuàng)建到處理完成過程中的十個(gè)事件。同時(shí),也向大家展示如何在這些事件中添加自己的代碼以達(dá)到預(yù)定的效果。
一.初始化對(duì)象
一個(gè)頁面的控件(以及頁面本身)最初應(yīng)被正確的初始化。通過在你的C#文件的構(gòu)造函數(shù)中聲名所有對(duì)象(如圖1),頁面就知道要?jiǎng)?chuàng)建多少對(duì)象以及它們的類型。一旦你在你的構(gòu)造函數(shù)中聲名了所有的對(duì)象,你就可以通過繼承類、方法、事件或是屬性訪問它們。然而,如果你的一些對(duì)象是在Aspx文件中指定的一些控件,那么這些控件就沒有屬性可言了。同時(shí),通過代碼訪問它們會(huì)產(chǎn)生一些意外的錯(cuò)誤,因?yàn)檫@些控件實(shí)例是沒有一個(gè)確定的創(chuàng)建順序的(如果它們是被一起創(chuàng)建的)。還有,你可以通過OnInit來重載初始化事件,圖示如下(圖1):

圖1

二.導(dǎo)入Viewstate數(shù)據(jù)
在初始化事件后,所有控件只可以通過它們的ID被引用訪問(因?yàn)檫€沒有相應(yīng)的DOM可使用)。在LoadViewState這個(gè)事件中,所有的控件將獲得它們的第一個(gè)屬性:Viewstate屬性。這個(gè)屬性最終將被返回給服務(wù)器以判斷這個(gè)頁面是已經(jīng)被用戶訪問完畢還是仍然在被用戶所訪問。Viewstate屬性以“名稱/值”對(duì)的字符串方式被保存,它包含了控件的文本以及值等信息。該屬性被存儲(chǔ)在一個(gè)隱藏的<input>控件的值屬性里,在請(qǐng)求頁面時(shí)被傳遞。這種方式比起Asp3.0的維持、判斷頁面狀態(tài)的方式有了很大的進(jìn)步啊。還有,你可以重載LoadViewState事件函數(shù)來對(duì)相應(yīng)的控件進(jìn)行值設(shè)定。下圖(圖2)是一個(gè)例子:

圖2

三.用LoadPostData處理Postback數(shù)據(jù)
在頁面創(chuàng)建的這個(gè)階段,服務(wù)器對(duì)頁面上的控件提交的表單數(shù)據(jù)(在Asp.net中稱postback數(shù)據(jù))進(jìn)行處理。當(dāng)一個(gè)頁面提交一個(gè)表單時(shí),框架就在每個(gè)提交了數(shù)據(jù)的控件上執(zhí)行一個(gè)IPostBackDataHandler接口操作。然后頁面執(zhí)行LoadPostData事件,解析頁面,找到每個(gè)執(zhí)行了IpostBackDataHandler接口操作的控件,并用恰當(dāng)?shù)膒ostback數(shù)據(jù)更新這些控件狀態(tài)。Asp.net是通過用NameValue集中的“名稱/值”對(duì)和每個(gè)控件的唯一的ID匹配來實(shí)現(xiàn)這一操作的。所以,在Asp.net的頁面上每個(gè)控件必須有一個(gè)唯一的ID,不可以出現(xiàn)幾個(gè)控件共有ID的情況。即使是用戶自定義的一些控件,框架也會(huì)賦予它們各自唯一的ID的。在LoadPostData事件后,就要執(zhí)行下面的RaisePostDataChanged事件了。
四.導(dǎo)入對(duì)象
在Load事件中,對(duì)象都實(shí)例化了。所有的對(duì)象第一次被布置在DOM頁面(在Asp.net中稱控件樹)里了并且可以通過代碼或是相關(guān)的位置被引用。這樣,對(duì)象就可以很容易的從客戶端獲得諸如寬度、高度、值、可見性等在Html中的屬性值。在Load事件中,當(dāng)然還有像設(shè)置控件屬性等操作的發(fā)生。這個(gè)過程是整個(gè)生命周期中最重要、最主要的,你可以通過調(diào)用OnLoad來重載Load事件,圖示如下(圖3):

圖3

五.RaisePostBackChanged事件
就像在上面提到的那樣,這個(gè)事件是發(fā)生在所有的控件執(zhí)行了IPostBackDataHandler接口操作并被正確的postback數(shù)據(jù)更新后的。在這個(gè)過程中,每個(gè)控件都被賦予一個(gè)布爾值來標(biāo)志該控件有沒有被更新。然后,Asp.net就在整個(gè)頁面上尋找任何已被更新過的控件并執(zhí)行RaisePostDataChanged事件操作。不過,這個(gè)事件是要在所有的控件都被更新了以及Load事件完成后才進(jìn)行的。這樣就保證了一個(gè)控件在被postback數(shù)據(jù)更新前,別的控件在RaisePostDataChanged事件中是不會(huì)被手動(dòng)改變的。
六.處理客戶端PostBack事件
當(dāng)由postback數(shù)據(jù)在服務(wù)器端引起的事件都完成后,產(chǎn)生postback數(shù)據(jù)的對(duì)象就執(zhí)行RaisePostBackEvent事件操作??墒菚?huì)有這種情況,由于一個(gè)控件狀態(tài)的改變使得它將表單返回給服務(wù)器或是用戶點(diǎn)擊了提交按鈕使得表單返回給服務(wù)器。在這種情況下應(yīng)該有相應(yīng)的處理代碼來體現(xiàn)事件驅(qū)動(dòng)這一面向?qū)ο螅∣OP)編程原則。由于要滿足呈現(xiàn)給瀏覽器的數(shù)據(jù)的精確性要求,在一系列postback事件中RaisePostBackEvent事件是最后發(fā)生的。
在postback過程中改變的控件不應(yīng)在執(zhí)行功能函數(shù)被調(diào)用后更新。也就是說,任何由于一個(gè)預(yù)期的事件而改變的數(shù)據(jù)應(yīng)該在最終的頁面上被反映出來。你可以通過修改RaisePostBackEvent函數(shù)來滿足你的要求,圖示如下(圖4):

圖4

七.預(yù)先呈遞對(duì)象
可以改變對(duì)象并將改變保存的最后時(shí)刻就是這一步――預(yù)先呈遞對(duì)象。這樣,你可以在這一步對(duì)控件的屬性、控件樹結(jié)構(gòu)等作出最后的修改。同時(shí)還不用考慮Asp.net對(duì)其作出任何改變,因?yàn)榇藭r(shí)已經(jīng)脫離了數(shù)據(jù)庫調(diào)用以及viewstate更新了。在這一步之后,對(duì)對(duì)象的所有修改將最終被確定,不能被保存到頁面的viewstate中了。你可以通過OnPreRender來重載這一步。
八.保存ViewState
所有對(duì)頁面控件的修改完成后viewstate就被保存了。對(duì)像的狀態(tài)數(shù)據(jù)還是保留在隱藏的<input>控件里面,呈現(xiàn)給Html的對(duì)象狀態(tài)數(shù)據(jù)也是從這里取得的。在SaveViewState事件中,其值能被保存到viewstate對(duì)象,然而這時(shí)在頁面上控件的修改卻不能了。你可以用SaveViewState來重載這一步,圖示如下(圖5):

圖5

九.呈遞給Html
運(yùn)用Html創(chuàng)建給瀏覽器輸出的頁面的時(shí)候Render事件就發(fā)生了。在Render事件過程中,頁面調(diào)用其中的對(duì)象將它們呈遞給Html。然后,頁面就可以以Html的形式被用戶的瀏覽器訪問了。當(dāng)Render事件被重載時(shí),開發(fā)者可以編寫自定義的Html代碼使得原先生成的Html都無效而按照新的Html來組織頁面。Render方法將一個(gè)HtmlTextWriter對(duì)象作為參數(shù)并用它將Html在瀏覽器上以網(wǎng)頁的形式顯示。這時(shí)仍然可以做一些修改動(dòng)作,不過它們只是客戶端的一些變化而已了。你可以重載Render事件,圖示如下(圖6):

圖6

十.銷毀對(duì)象
在呈遞給Html完成后,所有的對(duì)象都應(yīng)被銷毀。在Dispose事件中,你應(yīng)該銷毀所有在建立這個(gè)頁面時(shí)創(chuàng)建的對(duì)象。這時(shí),所有的處理已經(jīng)完畢,所以銷毀任何剩下的對(duì)象都是不會(huì)產(chǎn)生錯(cuò)誤的,包括頁面對(duì)象。你可以重載Dispose事件,見圖6。
全文總結(jié)
以上就是Asp.net頁面生命周期中的十個(gè)事件。每次我們請(qǐng)求一個(gè)Asp.net頁面時(shí),我們都經(jīng)歷著同樣的過程:從初始化對(duì)象到銷毀對(duì)象。通過了解Asp.net頁面的內(nèi)部運(yùn)行機(jī)制,我相信大家在編寫、調(diào)試代碼的時(shí)候會(huì)更加游刃有余的。
http://www.ccw.com.cn/htm/center/prog/02_3_12_2.asp

 

 

今天碰到一個(gè)問題,在MasterPage的OnLoad中加入一個(gè)判斷,希望在ContentPage的OnLoad之前執(zhí)行,結(jié)果發(fā)現(xiàn) MasterPage的Onload在ContentPage的OnLoad后執(zhí)行,后來把這個(gè)判斷移動(dòng)到MasterPage的OnInit中搞定

在一個(gè)單獨(dú)的頁面中,執(zhí)行順序?yàn)?/p>

  1. PreInit
  2. Init
  3. InitComplete
  4. PreLoad
  5. Load
  6. LoadComplete
  7. PreRender
  8. PreRenderComplete

在頁面有MasterPage的時(shí)候

  1. ContentPage.PreInit
  2. Master.Init
  3. ContentPage.Init
  4. ContentPage.InitComplete
  5. ContentPage.PreLoad
  6. ContentPage.Load
  7. Master.Load
  8. ContentPage.LoadComplete
  9. ContentPage.PreRender
  10. Master.PreRender

注意上面高亮的部分,除此之外其他的地方一般是先MasterPage后ContentPage,這里恰恰相反

那么控件的加載和頁面的幾個(gè)事件的關(guān)系是什么呢?

一般情況下,頁面中的控件回先于OnInit執(zhí)行,亦即

  1. Master中控件的Init
  2. ContentPage中控件的Init
  3. Master.Init
  4. Content.Init
  5. Content.Load
  6. Master.Load
  7. Master.中用戶控件load
  8. ContentPage頁面中的用戶控件的 page_load

可以看到控件的Init在Page的Init前執(zhí)行,所以在Init中我們就可以放心使用頁面中的控件了,但是下面的情況不同

如果你的頁面中使用WebControl,或者從WebControl繼承的控件,WebControl需要使用 CreateChildControls()來加載子控件,這個(gè)函數(shù)會(huì)在這個(gè)控件的Init后被調(diào)用,也就是說在一個(gè)WebControl的OnInit 中,是沒有辦法直接使用其中的控件的,不過我們也可以自己用FindControl把控件加載進(jìn)來,WebControl的其他方法的加載順序見下表

EventDescription
InitYou can use the OnInit method to trap this event and initialize member variables and other values.
LoadViewStateYou can trap this event to customize how the control retrieves information from the ASP.NET hidden ViewState field.
LoadThis event is raised after you create and initialize the control. This is the best place to make the connection to the database or load document content. You can trap the Load event by adding the OnLoad method to the class.
PreRenderThis event is raised before ASP.NET renders the control. Any changes to the control's state are saved into the hidden ViewState field.
SaveViewStateThis event is raised before the control state is persisted into the hidden ViewState field. You can trap the event to customize how this information is stored.
RenderYou can use the Render method to respond to this event and specify the HTML code that represents the component's content.
DisposeThis event is useful for cleanup operations. It's raised before the control is torn down and is the best place to free the resources created during the load phase.
UnloadThis event is raised before the control is torn down. The official documentation says not to use this event to perform cleanup, and to rely on the Dispose event instead.

2)ASP.NET頁面生命周期描述

在以前寫個(gè)一篇關(guān)于ASP.NET頁面生命周期的草稿,最近又看了看ASP.NET,做個(gè)補(bǔ)充,看看頁面初始過程到底是怎么樣的
下面是ASP.NET頁面初始的過程:
1. Page_Init();
2. Load ViewState;
3. Load Postback data;
4. Page_Load();
5. Handle control events;
6. Page_PreRender();
7. Page_Render();
8. Unload event;
9. Dispose method called;

下面對(duì)其中的一些過程作下描述:
1. Page_Init();
這個(gè)過程主要是初始化控件,每次頁面載入執(zhí)行這個(gè)初始過程,包括第一次和以后的Postback(這里說下Postback,其實(shí)就可以簡(jiǎn)單理解成用戶點(diǎn)
擊SUBMIT按鈕之類的,把表單<Form>提交給服務(wù)器,這就是一次postback),在這里面可以訪問控件,但是這里面的控件值不是我們期待的控件里面的值,他只是一個(gè)控件的初始值(默認(rèn)值),舉例: 比如一個(gè)TextBox1,我們填入了"哈哈",在點(diǎn)擊SUBMIT提交了頁面后,在Page_Init()里面,我們?cè)L問到的TextBox1.Text不是我們的"哈哈",而是開始的""空字符串,如果TextBox1在我們?cè)O(shè)計(jì)的時(shí)候提供了默認(rèn)值,這里訪問到的也就是提供的默認(rèn)值,為什么呢,這就要看下一個(gè)過程了.

對(duì)應(yīng)的事件Page.Init

2. Load ViewState
這個(gè)過程是載入VIEWSTATE和Postback數(shù)據(jù),比如我們上面的TextBox1,這時(shí)就賦了"哈哈",所以,在Post_Init()對(duì)控件賦值是無意義的,它都會(huì)
在這個(gè)過程里被改寫,當(dāng)然第一次頁面載入例外,因?yàn)闆]有VIEWSTATE數(shù)據(jù)。

沒有對(duì)應(yīng)的事件

3.Load Postback data;
上面說了,Postback可以理解成用戶提交表單數(shù)據(jù),所以這里就是處理表單數(shù)據(jù),當(dāng)然這里要設(shè)計(jì)到控件的設(shè)計(jì),一般情況不會(huì)要我們自己處理這
個(gè)過程,我們暫且略過. (在以前那篇關(guān)于ASP.NET頁面生命周期的簡(jiǎn)單描述中,把這個(gè)過程和Load ViewState放在了一起,其實(shí)那是微軟提供的生命周期過程,這里單獨(dú)提出來是為了讓大家明白這是一個(gè)單獨(dú)的過程)

沒有對(duì)應(yīng)的事件
4. Page_Load();
這個(gè)過程也是每次頁面載入時(shí)一定會(huì)執(zhí)行的,但是注意和Page_Init的區(qū)別,上面已經(jīng)涉及了,這里注意的是一般都會(huì)用到Page.IsPostBack,該
值指示該頁是否正為響應(yīng)客戶端回發(fā)而加載,或者它是否正被首次加載和訪問。
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
   //第一次執(zhí)行的CODE HERE
}
else
{
    //用戶提交FORM(即Postback)CODE HERE
}

//每次這里的都回執(zhí)行CODE HERE
}

對(duì)應(yīng)的事件Page.Load

5. Handle control events;
這個(gè)過程里,相應(yīng)具體的控件事件,比如private void ListBox1_SelectedIndexChanged(object sender, System.EventArgs e)事件等等

沒有對(duì)應(yīng)的事件(我們自己的事件函數(shù)都包括在這個(gè)過程里比如上面的ListBox1_SelectedIndexChanged)

6. Page_
預(yù)先呈遞對(duì)象,這里是在向用戶程序呈現(xiàn)數(shù)據(jù)的倒數(shù)第二步,我估計(jì)提供這個(gè)過程的意義,也就是在這里能對(duì)控件屬性等等要呈現(xiàn)給用戶的數(shù)據(jù)進(jìn)
行修改,這也是最后的修改,以前的修改(比如在Page_Init里面)都可能被覆蓋.做完這了還會(huì)進(jìn)行一個(gè)操作就是保存狀態(tài),即SaveViewState.

對(duì)應(yīng)的事件時(shí)Page.PreRender

7. Page_Render();
大家可以在瀏纜器里View->Source查看到,每個(gè)頁面都有一個(gè)隱藏的<input>,這里面的"__VIEWSTATE"就是我們服務(wù)器寫回來的頁面狀態(tài)信息,
在 這個(gè)之前,服務(wù)器要呈現(xiàn)頁面(也就是構(gòu)造HTML格式的文件),就是從這個(gè)"__VIEWSTATE"里面獲取的數(shù)據(jù),當(dāng)然大家也注意到了,這里有個(gè) Page.Render事件,我們可以添加自己的處理代碼,也就是說我們又可以更改數(shù)據(jù),不過這里推薦不要在這里修改,既然提供了PreRender,就 應(yīng)該在里面做最后的修改,當(dāng)然這不是必須的,只是推薦!

對(duì)應(yīng)的事件Page.Render

8. Unload event;
大家應(yīng)該明白,當(dāng)想服務(wù)器請(qǐng)求一個(gè)對(duì)象的時(shí)候,就會(huì)在內(nèi)存里生成一個(gè)繼承頁面對(duì)象,也就是頁面的類,它繼承自System.Web.UI.Page.
當(dāng)頁面對(duì)象從內(nèi)存中卸載時(shí)發(fā)生,將觸發(fā)該事件.

對(duì)應(yīng)的事件Page.Unload

9. Dispose method called;
銷毀所有的對(duì)象.當(dāng)從內(nèi)存釋放Page時(shí)發(fā)生,這是生存期的最后階段??赡艿?和9似乎有些模糊,不過我也沒怎么搞清楚,待研究!

對(duì)應(yīng)的事件Dispose

以上就是ASP.NET頁面周期的描述。

注意上面灰色背景的文字,如果一個(gè)過程中有對(duì)應(yīng)的事件,我們可以自己定義一個(gè)函數(shù)(當(dāng)然先在MSDN中找到函數(shù)原型),然后在
InitializeComponent中向事件的鏈表上添加上去,像下面:
private void InitializeComponent()
{   
this.Unload += new System.EventHandler(this.MainWebForm_Unload);
this.Load += new System.EventHandler(this.Page_Load);
this.Init += new System.EventHandler(this.Page_Init);
this.PreRender += new System.EventHandler(this.My_PreRender);
}

對(duì)于幾個(gè)沒有對(duì)應(yīng)事件的過程,比如2.Load ViewState,我們可以重載Page的虛函數(shù)protected override void LoadViewState(object savedState);來添加自己的控制代碼,不過切忌掉用基類的對(duì)應(yīng)方法,比如:
protected override void LoadViewState(object savedState)
{
//自己處理VIEWSTATE
base.LoadViewState (savedState);
}

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ASP.NET頁面生命周期和asp.net應(yīng)用程序生命周期 - 海里的貝殼的日志 - 網(wǎng)易...
說不清 ASP.NET頁面生命周期描述 (轉(zhuǎn))
asp.net 頁面生命周期(Page lifeCycle) - grgufo的專欄 - ...
AspNet2.0頁面生命周期
ASP.Net請(qǐng)求處理機(jī)制初步探索之旅
aspx頁面事件執(zhí)行順序
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服