ASP.NET 中的页面生命周期

作者 : 慕源网 本文共7839个字,预计阅读时间需要20分钟 发布时间: 2021-10-21 共518人阅读

让我们了解 ASP.NET 页面生命周期以及在 ASP.NET 页面生命周期中如何触发不同的事件。当 ASP.NET 页面运行时,该页面会经历一个生命周期,在该生命周期中它会执行一系列处理步骤。这些包括初始化、实例化控件、恢复和维护状态、运行事件处理程序代码和呈现。以下是 ASP.Net 页面生命周期的各个阶段或事件。

预初始化(PreInit)

  1. 检查 IsPostBack 属性以确定这是否是第一次处理页面。
  2. 创建或重新创建动态控件。
  3. 动态设置母版页。
  4. 动态设置 Theme 属性。

注意
如果请求是回发,则控件的值尚未从视图状态恢复。如果在此阶段设置控件属性,它的值可能会在下一个事件中被覆盖。

Init

  1. 此事件在每个控件初始化后触发。
  2. 每个控件的 UniqueID 都已设置,并且已应用任何外观设置。
  3. 使用此事件读取或初始化控件属性。
  4. “Init”事件首先为层次结构中最底层的控件触发,然后向上触发层次结构,直到它为页面本身触发。

初始化完成

  1. 到目前为止,viewstate 值尚未加载,因此您可以使用此事件对要确保在下一次回发后持久化的视图状态进行更改。
  2. 由 Page 对象引发。
  3. 将此事件用于处理需要完成所有初始化的任务。

预加载(OnPreLoad)

  1. 在页面为其自身和所有控件加载视图状态之后,以及在它处理包含在 Request 实例中的回发数据之后引发。
  2. 在 Page 实例引发此事件之前,它会为自身和所有控件加载视图状态,然后处理包含在 Request 实例中的任何回发数据。
  3. 加载 ViewState:将 ViewState 数据加载到控件。
  4. 加载回发数据:回发数据现在传递给页面控件。

Load

  1. Page 对象调用 Page 对象上的 OnLoad 方法,然后递归地对每个子控件执行相同的操作,直到加载页面和所有控件。单个控件的 Load 事件发生在页面的 Load 事件之后。
  2. 这是页面生命周期中第一个恢复所有值的地方。
  3. 大多数代码检查 IsPostBack 的值以避免不必要的重置状态。
  4. 您也可以在此方法中调用 Validate 并检查 IsValid 的值。
  5. 您还可以使用此方法创建动态控件。
  6. 使用 OnLoad 事件方法在控件中设置属性并建立数据库连接。

Control PostBack Event(s)-控制回发事件

  1. ASP.NET 现在调用页面或其控件上导致发生回发的任何事件。
  2. 使用这些事件来处理特定的控件事件,例如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
  3. 在回发请求中,如果页面包含验证器控件,请在执行任何处理之前检查页面和各个验证控件的 IsValid 属性。
  4. 这只是控制事件的一个例子。这是导致回发的按钮单击事件。

LoadComplete

  1. 在事件处理阶段结束时引发。
  2. 将此事件用于需要加载页面上所有其他控件的任务。

OnPreRender

  1. 在 Page 对象创建了呈现页面所需的所有控件后引发,包括复合控件的子控件。
  2. Page 对象在 Page 对象上引发 PreRender 事件,然后递归地对每个子控件执行相同的操作。单个控件的 PreRender 事件发生在页面的 PreRender 事件之后。
  3. 单个控件的 PreRender 事件发生在页面的 PreRender 事件之后。
  4. 允许对页面或其控件进行最终更改。
  5. 此事件发生在保存 ViewState 之前,因此会保存此处所做的任何更改。
  6. 例如:在此事件之后,您不能更改按钮的任何属性或更改任何视图状态值。
  7. 每个设置了 DataSourceID 属性的数据绑定控件都调用其 DataBind 方法。
  8. 使用该事件对页面或其控件的内容进行最终更改。

OnSaveStateComplete

  1. 在为页面和所有控件保存视图状态和控件状态后引发。
  2. 在此事件发生之前,已为页面和所有控件保存了 ViewState。
  3. 此时对页面或控件的任何更改都将被忽略。
  4. 使用此事件执行需要保存视图状态但不对控件进行任何更改的任务。

渲染方法

  1. 这是页面对象及其控件的方法(而不是事件)。
  2. Render 方法生成客户端 HTML、动态超文本标记语言 (DHTML) 和脚本,这些是在浏览器中正确显示控件所必需的。

UnLoad

  1. 此事件用于清理代码。
  2. 此时,所有处理都已发生,可以安全地处理任何剩余的对象,包括 Page 对象。
  3. 可以在以下位置执行清理:
    • 类的实例,即对象
    • 关闭打开的文件
    • 关闭数据库连接。
  4. 此事件针对每个控件发生,然后针对页面发生。
  5. 在卸载阶段,页面及其控件已呈现,因此您无法对响应流进行进一步更改。
  6. 如果您尝试调用诸如 Response.Write 方法之类的方法,则该页面将引发异常。

例子

示例 1:控制值
在以下代码中,我已将值分配给每个事件的标签控件。当您运行代码时,您将看到在“Page_UnLoad”中,值未分配给标签。为什么?因为,在卸载阶段,页面及其控件已经呈现,因此您无法更改这些值。
请注意代码注释和输出。它将帮助您清楚地理解这些概念。
public partial class PageLiftCycle: System.Web.UI.Page {  
    protected void Page_PreInit(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        lblName.Text = lblName.Text + "<br/>" + "PreInit";  
    }  
    protected void Page_Init(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        lblName.Text = lblName.Text + "<br/>" + "Init";  
    }  
    protected void Page_InitComplete(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        lblName.Text = lblName.Text + "<br/>" + "InitComplete";  
    }  
    protected override void OnPreLoad(EventArgs e) {  
        //Work and It will assign the values to label.  
        //If the page is post back, then label contrl values will be loaded from view state.  
        //E.g: If you string str = lblName.Text, then str will contain viewstate values.  
        lblName.Text = lblName.Text + "<br/>" + "PreLoad";  
    }  
    protected void Page_Load(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        lblName.Text = lblName.Text + "<br/>" + "Load";  
    }  
    protected void btnSubmit_Click(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        lblName.Text = lblName.Text + "<br/>" + "btnSubmit_Click";  
    }  
    protected void Page_LoadComplete(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        lblName.Text = lblName.Text + "<br/>" + "LoadComplete";  
    }  
    protected override void OnPreRender(EventArgs e) {  
        //Work and It will assign the values to label.  
        lblName.Text = lblName.Text + "<br/>" + "PreRender";  
    }  
    protected override void OnSaveStateComplete(EventArgs e) {  
        //Work and It will assign the values to label.  
        //But "SaveStateComplete" values will not be available during post back. i.e. View state.  
        lblName.Text = lblName.Text + "<br/>" + "SaveStateComplete";  
    }  
    protected void Page_UnLoad(object sender, EventArgs e) {  
        //Work and it will not effect label contrl, view stae and post back data.  
        lblName.Text = lblName.Text + "<br/>" + "UnLoad";  
    }  
}   
输出
第一次输出Page Load:

当您单击提交按钮输出时:

在页面第一次加载 EnableViewState=”false” 时:

当您单击带有 EnableViewState=”false” 的提交按钮输出时:

示例 2 ViewState 值
请注意代码注释和输出。它将帮助您清楚地理解这些概念。
public partial class PageLiftCycle: System.Web.UI.Page {  
    protected void Page_PreInit(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        //Note : If page is post back or first time call and you have not set any values to ViewState["value"], then  
        //Convert.ToString(ViewState["value"]) is always empty.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "PreInit";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
    protected void Page_Init(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        //Note : If page is post back or first time call and you have not set any values to ViewState["value"] in privious events, then  
        //Convert.ToString(ViewState["value"]) is always empty.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "Init";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
    protected void Page_InitComplete(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        //Note : If page is post back or first time call and you have not set any values to ViewState["value"] in privious events, then  
        //Convert.ToString(ViewState["value"]) is always empty.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "InitComplete";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
    protected override void OnPreLoad(EventArgs e) {  
        //Work and It will assign the values to label.  
        //Note : If page is post back and you have set or not set any values to ViewState["value"] in privious events, then  
        //Convert.ToString(ViewState["value"]) will always have post back data.  
        //E.g: If you string str = Convert.ToString(ViewState["value"]), then str will contain post back values.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "PreLoad";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
    protected void Page_Load(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "Load";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
    protected void btnSubmit_Click(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "btnSubmit_Click";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
    protected void Page_LoadComplete(object sender, EventArgs e) {  
        //Work and It will assign the values to label.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "LoadComplete";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
    protected override void OnPreRender(EventArgs e) {  
        //Work and It will assign the values to label.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "PreRender";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
    protected override void OnSaveStateComplete(EventArgs e) {  
        //Work and It will assign the values to label.  
        //But "SaveStateComplete" values will not be available during post back. i.e. View state.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "SaveStateComplete";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
    protected void Page_UnLoad(object sender, EventArgs e) {  
        //Work and it will not effect label contrl values, view state and post back data.  
        ViewState["value"] = Convert.ToString(ViewState["value"]) + "<br/>" + "UnLoad";  
        lblName.Text = Convert.ToString(ViewState["value"]);  
    }  
}  
输出
在第一个 Time Page Load 输出期间:

当您单击提交按钮输出时:

在页面第一次加载 EnableViewState=”false” 时:

示例 3 ViewState 值
请注意代码注释和输出。它将帮助您清楚地理解这些概念。
public partial class PageLiftCycle: System.Web.UI.Page {  
    protected void Page_PreInit(object sender, EventArgs e) {  
        Response.Write("<br/>" + "PreInit");  
    }  
    protected void Page_Init(object sender, EventArgs e) {  
        Response.Write("<br/>" + "Init");  
    }  
    protected void Page_InitComplete(object sender, EventArgs e) {  
        Response.Write("<br/>" + "InitComplete");  
    }  
    protected override void OnPreLoad(EventArgs e) {  
        Response.Write("<br/>" + "PreLoad");  
    }  
    protected void Page_Load(object sender, EventArgs e) {  
        Response.Write("<br/>" + "Load");  
    }  
    protected void Page_LoadComplete(object sender, EventArgs e) {  
        Response.Write("<br/>" + "LoadComplete");  
    }  
    protected override void OnPreRender(EventArgs e) {  
        Response.Write("<br/>" + "PreRender");  
    }  
    protected override void OnSaveStateComplete(EventArgs e) {  
        Response.Write("<br/>" + "SaveStateComplete");  
    }  
    protected void Page_UnLoad(object sender, EventArgs e) {  
        //Runtime Error : Response is not available in this context.  
        //Response.Write("<br/>" + "UnLoad"); //Error  
    }  
}  

输出

注意:如果你写 Response.Write(“<br/>” + “UnLoad”); 在 Page_UnLoad 事件中,它将生成运行时错误“响应在此上下文中不可用”。

我希望你喜欢这篇文章。


慕源网 » ASP.NET 中的页面生命周期

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录