最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.Net頁(yè)面生命周期與Page_Load方法的工作原理介紹

 更新時(shí)間:2022年05月12日 15:57:07   作者:springsnow  
這篇文章介紹了ASP.Net頁(yè)面生命周期與Page_Load方法的工作原理,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、ASP.Net Web應(yīng)用程序中的請(qǐng)求處理過程

二、 http模塊生命周期:

三、Asp.NET頁(yè)面生命周期

1、階段

階段說明
請(qǐng)求頁(yè)面(Page Request)嚴(yán)格地說,這個(gè)階段不是頁(yè)面生命周期的一部分。而是頁(yè)面生命周期之前的一個(gè)階段。Asp.NET接收到一個(gè)頁(yè)面請(qǐng)求之后,執(zhí)行分析和編譯頁(yè)面的工作或者從緩存中取出該頁(yè)面發(fā)送給客戶端。
開始(Start)在這個(gè)階段,Asp.NET設(shè)置Page對(duì)象的Request和Response屬性;確定該頁(yè)面請(qǐng)求是否為PostBack;給頁(yè)面設(shè)置UICulture屬性。
初始化(Initialization)頁(yè)面和控件對(duì)象的初始化;為控件設(shè)置UniqueID;為頁(yè)面設(shè)置Master Page和Theme;需要特別注意的是,在這個(gè)階段,客戶端提交的數(shù)據(jù),還沒有被恢復(fù)到頁(yè)面控件中去,包括ViewState在內(nèi)。
加載(Load)加載ViewState; 將表單數(shù)據(jù)設(shè)置到對(duì)應(yīng)控件中去。
回發(fā)事件(PostBack event)如果當(dāng)前請(qǐng)求是一個(gè)PostBack請(qǐng)求,那么必然有某個(gè)事情導(dǎo)致了這次PostBack, 現(xiàn)在就到了執(zhí)行該事件在服務(wù)器上的Event Handler的時(shí)候了。          
這個(gè)階段主要的問題在于Validation和Event Handler的執(zhí)行次序。           
    1.如果該Event本身沒有直接導(dǎo)致Validation, 比如我在Button上設(shè)置了不需要Validation,那么該Button的Click Event Handler先執(zhí)行,然后頁(yè)面上會(huì)執(zhí)行頁(yè)面上所有Validator 控件的Validator方法,然后設(shè)置頁(yè)面的IsValid屬性。           
    2.如果該Event本身直接導(dǎo)致了Validation,比如用戶點(diǎn)擊了一個(gè)Button,這個(gè)Button默認(rèn)就會(huì)導(dǎo)致Validator被調(diào)用。這時(shí)候,Validation的執(zhí)行是在Button的Click Event Handler之前的。等你進(jìn)入Button的Click Event Handler的時(shí)候,頁(yè)面的IsValid屬性已經(jīng)設(shè)置好了。
渲染(Rendering)Asp.NET將頁(yè)面和所有控件的ViewState保存到Form表單中去。然后調(diào)用所有控件和頁(yè)面的Render方法來(lái)輸出Html.
卸載(Unload)執(zhí)行到這個(gè)階段的時(shí)候,頁(yè)面已經(jīng)將Html輸出到客戶端了。這個(gè)階段要做的事情就包括:卸載Request對(duì)象和Response對(duì)象,執(zhí)行一些清理工作。

下面將頁(yè)面生命周期與服務(wù)器控件生命周期在一張圖上(從MSDN中復(fù)制)綜合展示:

2、頁(yè)面中事件/階段的執(zhí)行模式:

事件&方法Page ONLYControl ONLY頂層到底層頂層到頂層
PreInitYES ——  
Init事件 YES
InitCompleteYES ——
LoadViewState方法YES 
ProcessPostData方法YES 
PreLoadYES ——
Load事件YES 
PostBack Event YES——
LoadCompleteYES ——
PreRender事件YES 
DataBinding Event YES——
PreRenderCompleteYES ——
SaveViewState方法YES 
SaveStateCompleteYES ——
Render方法 YES
Unload事件 YES

3、示例程序

public partial class _Default : System.Web.UI.Page
{
    protected int i = 1;

    protected void Page_PreInit(object sender, EventArgs e)
    {
        Response.Write(i + ".PreInit:當(dāng)頁(yè)面初始化開始時(shí)發(fā)生");
        i++;
        Response.Write("");
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        Response.Write(i + ".Init:當(dāng)服務(wù)器空間初始化時(shí)發(fā)生");
        i++;
        Response.Write("");
    }

    protected void Page_InitComplete(object sender, EventArgs e)
    {
        Response.Write(i + ".InitComplete:當(dāng)頁(yè)初始化完成時(shí)發(fā)生");
        i++;
        Response.Write("");
    }

    protected void Page_PreLoad(object sender, EventArgs e)
    {
        Response.Write(i + ".PreLoad:當(dāng)頁(yè)load事件前發(fā)生");
        i++;
        Response.Write("");
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(i + ".Load:當(dāng)服務(wù)器控件加載到Page對(duì)象中時(shí)發(fā)生(加載頁(yè)面時(shí))");
        i++;
        Response.Write("");

        //在Load和LoadComplete之間會(huì)執(zhí)行控件事件.
        //如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
    }

    protected void Page_LoadComplete(object sender, EventArgs e)
    {
        Response.Write(i + ".LoadComplete:當(dāng)頁(yè)面生命周期的加載階段結(jié)束時(shí)發(fā)生");
        i++;
        Response.Write("");
    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        Response.Write(i + ".PreRender:當(dāng)頁(yè)加載控件之后,呈現(xiàn)之前發(fā)生,使用該事件對(duì)頁(yè)或其控件的內(nèi)容進(jìn)行最后更改(預(yù)呈現(xiàn))");
        i++;
        Response.Write("");
    }


    protected void Page_PreRenderComplete(object sender, EventArgs e)
    {
        Response.Write(i + ".PreRenderComplete:呈現(xiàn)內(nèi)容前發(fā)生.(預(yù)呈現(xiàn)完成)");
        i++;
        Response.Write("");
    }

    protected void Page_SaveStateComplete(object sender, EventArgs e)
    {
        /*網(wǎng)頁(yè)上控件的狀態(tài)信息是在 PreRenderComplete 事件后保存的。
       在SaveStateComplete事件之前用Trace查看頁(yè)時(shí)其實(shí)在該事件前還有
       一個(gè)SaveState事件,只是這里無(wú)法演示.
       
       注意:SaveStateComplete 事件在將頁(yè)和頁(yè)上控件的視圖狀態(tài)和控件狀態(tài)保存到持久性介質(zhì)之后引發(fā)。
       這是在頁(yè)被呈現(xiàn)到請(qǐng)求瀏覽器之前引發(fā)的最后一個(gè)事件。*/

        Response.Write(i + ".SaveStateComplete:在頁(yè)已完成對(duì)頁(yè)和頁(yè)上控件的所有視圖狀態(tài)和控件狀態(tài)信息的保存后發(fā)生.");
        i++;
        Response.Write("");

        /*最后一部操作
        呈現(xiàn):Render:
        它不是事件;在處理的這個(gè)階段,Page 對(duì)象會(huì)在每個(gè)控件上調(diào)用此方法Render()。
        所有 ASP.NET Web 服務(wù)器控件都有一個(gè)用于寫出發(fā)送給瀏覽器的控件標(biāo)記的 Render 方法。*/


        /*當(dāng)你關(guān)閉頁(yè)面的時(shí)候就會(huì)引發(fā)UnLoad(當(dāng)服務(wù)器控件從內(nèi)存中卸載時(shí)發(fā)生)
         和Disposed兩事件(當(dāng)從內(nèi)存釋放服務(wù)器控件時(shí)發(fā)生,這是服務(wù)器控件生存期的最后階段)
        
        首先加載UnLoad事件:卸載頁(yè)面:完全呈現(xiàn)頁(yè)、將頁(yè)發(fā)送至客戶端并準(zhǔn)備丟棄時(shí),
        將調(diào)用卸載。此時(shí),將卸載頁(yè)屬性(如Response和Request)并執(zhí)行清理.
         
        最后加載Disposed事件,釋放資源,生命周期結(jié)束.... 
        */
    }
}

結(jié)果顯示:

四、PageLoad 與 OnLoad區(qū)別:

1、用VS.Net生成的頁(yè)面中的Page_Load方法(事件處理程序)就是響應(yīng)Page.Load事件的。對(duì)于每一次請(qǐng)求,Load事件都會(huì)觸發(fā),Page_Load方法就會(huì)執(zhí)行。

2、@Page指令中的AutoEventWireup=true時(shí),頁(yè)面會(huì)與某些特殊的事件方法綁定,自動(dòng)識(shí)別這些具有特定名稱的事件。這些特定名稱包括:Page_Init, Page_Load, Page_DataBind, Page_PreRender和Page_Unload等。asp.net不需要顯示的來(lái)綁定事件處理程序,它會(huì)在運(yùn)行時(shí)自動(dòng)的根據(jù)他們的方法名和簽名綁定事件,對(duì)每一個(gè)事件,ASP.NET會(huì)根據(jù)Page_eventname這種模式去搜尋方法,如果沒有找到帶此簽名的事件處理程序,則 ASP.NET 將檢查沒有參數(shù)的重載。

當(dāng)時(shí)AutoEventWireup=false的時(shí)候,則必須顯示綁定事件方法,比如,你有一個(gè)Page_Load方法,只有當(dāng)你這樣寫代碼的時(shí)候,才會(huì)觸發(fā)事件方法:Page.Load += Page_Load;在這種情況下,方法名稱不必遵循某一模式。

3、Page.Load事件是在System.Web.UI.Control類中定義的(此類是Page和所有服務(wù)器控件的基類),是在OnLoad方法中觸發(fā)Page.Load事件。

因此如果在Page頁(yè)面里重寫了OnLoad方法,則此時(shí)雖然是用的AutoEventWireup=true,但Page_Load方法也不會(huì)被執(zhí)行。如果比較考慮性能,建議用override Oneventname方法的方式來(lái)實(shí)現(xiàn)頁(yè)面的事件加載。

public partial class Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("2");
    }
 
    protected override void OnLoad(EventArgs e)
    {
        Response.Write("1");
        base.OnLoad(e);
        Response.Write("3");
    }
}

輸出123。首先由于override父類的OnLoad,所以先執(zhí)行頁(yè)面的OnLoad方法,輸出1,然后執(zhí)行父類的OnLoad方法,一直上推到執(zhí)行完Control類的OnLoad方法后,執(zhí)行Load事件的委托鏈方法,執(zhí)行Page_Load方法,輸出2。最后回到

頁(yè)面的OnLoad方法輸出3。如果AutoEventWireup=false,則Page_Load不執(zhí)行。

五、總結(jié)

三張圖片詳解Asp.Net 全生命周期

1、第一張圖片從全局說明從客戶端發(fā)出一個(gè)Request請(qǐng)求,服務(wù)器windows內(nèi)核中的HTTP.SYS組件接收該請(qǐng)求開始到IIS處理完該請(qǐng)求并響應(yīng)到客戶端結(jié)束。

2、第二張圖片為圖1中Http處理管線的詳細(xì)步驟

3、 第三張圖片為圖2Http處理管線中調(diào)用處理程序(HttpHandler, 此處為Page對(duì)象)的詳細(xì)生命周期過程。

到此這篇關(guān)于ASP.Net頁(yè)面生命周期與Page_Load方法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET Core應(yīng)用程序配置文件AppSetting.json

    ASP.NET Core應(yīng)用程序配置文件AppSetting.json

    這篇文章介紹了ASP.NET Core應(yīng)用程序配置文件AppSetting.json,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • ASP.Net?Core?MVC基礎(chǔ)系列之環(huán)境設(shè)置

    ASP.Net?Core?MVC基礎(chǔ)系列之環(huán)境設(shè)置

    這篇文章介紹了ASP.Net?Core?MVC環(huán)境設(shè)置的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C#委托方法Func()中GetInvocationList()方法的用法介紹

    C#委托方法Func()中GetInvocationList()方法的用法介紹

    這篇文章介紹了C#委托方法Func()中GetInvocationList()方法的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ORM框架之Dapper簡(jiǎn)介和性能測(cè)試

    ORM框架之Dapper簡(jiǎn)介和性能測(cè)試

    這篇文章介紹了ORM框架之Dapper簡(jiǎn)介和性能測(cè)試,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • .Net創(chuàng)建型設(shè)計(jì)模式之建造者、生成器模式(Builder)

    .Net創(chuàng)建型設(shè)計(jì)模式之建造者、生成器模式(Builder)

    這篇文章介紹了.Net設(shè)計(jì)模式之建造者、生成器模式(Builder),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 讓Sqlite脫離VC++ Runtime獨(dú)立運(yùn)行的方法

    讓Sqlite脫離VC++ Runtime獨(dú)立運(yùn)行的方法

    這篇文章主要介紹了讓Sqlite脫離VC++ Runtime獨(dú)立運(yùn)行的方法,需要的朋友可以參考下
    2014-07-07
  • 給.net初學(xué)者的一些建議(共勉之)

    給.net初學(xué)者的一些建議(共勉之)

    給.net初學(xué)者的一些建議(共勉之)...
    2006-09-09
  • WPF布局及布局容器介紹

    WPF布局及布局容器介紹

    這篇文章介紹了WPF布局及布局容器,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ASP.NET?Core命令行界面CLI用法

    ASP.NET?Core命令行界面CLI用法

    這篇文章介紹了ASP.NET?Core命令行界面CLI的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • .net?6精簡(jiǎn)版webapi教程及熱重載、代碼自動(dòng)反編譯演示

    .net?6精簡(jiǎn)版webapi教程及熱重載、代碼自動(dòng)反編譯演示

    這篇文章介紹了.net?6精簡(jiǎn)版webapi教程及熱重載、代碼自動(dòng)反編譯演示,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評(píng)論

遂平县| 凤城市| 志丹县| 定州市| 五指山市| 屯昌县| 西峡县| 宁晋县| 金乡县| 永胜县| 长沙市| 西充县| 高碑店市| 岳池县| 顺平县| 尚志市| 广水市| 茂名市| 鲜城| 积石山| 栾城县| 正镶白旗| 高邮市| 崇文区| 冀州市| 富川| 芦山县| 潜江市| 连云港市| 辽阳市| 嵩明县| 汝城县| 北京市| 开封县| 昭苏县| 奉贤区| 贵定县| 泗阳县| 吉首市| 武定县| 额敏县|