asp.net页执行开始到结束有执行了哪些事件顺序是怎样的

Page 执行中将按照如下顺序激活事件:

Page.PreInit
Page.Init
Page.InitComplite
Page.PreLoad
Page.Load
Page.LoadComplete
Page.PreRender
Page.PreRenderComplete

 

在 ASP.NET 页面的寿命周期内,Page 对象会公开一些被频繁使用的标准事件。ASP.NET 页面框架在运行时,会自动连接到(连线)这些方法的相应代理实例。这样您就无须编写必要的“粘接代码”。以下列表按激发顺序提供运行时连线的代理实例:
• Page_Init:出现此事件期间,您可以初始化值或连接可能具有的任何事件处理程序。
• Page_Load:出现此事件期间,您可以执行一系列的操作来首次创建 ASP.NET 页面或响应由投递引起的客户端事件。在此事件之前,已还原页面和控件视图状态。使用 IsPostBack 页面属性检查是否为首次处理该页面。如果是首次处理,请执行数据绑定。此外,请读取并更新控件属性。
• Page_DataBind:在页面级别调用 DataBind 方法时,将引发 DataBind 事件。如果在单个控件上调用 DataBind,则它只激发它下面控件的 DataBind 事件。
• Page_PreRender:恰好在保存视图状态和呈现控件之前激发 PreRender 事件。您可以使用此事件在控件上执行所有最后时刻操作。
• Page_Unload:完成页面呈现之后,将激发 Page_Unload 事件。此事件是执行最终清理工作的合适位置。这包括清理打开的数据库连接、丢弃对象或关闭打开的文件等操作。
以下列表概括了非确定性事件。 • Page_Error:如果在页面处理过程中出现未处理的例外,则激发 Error 事件。错误事件为您提供了妥善处理错误的机会。
• Page_AbortTransaction:如果要指明交易是成功还是失败,交易事件非常有用。此事件通常用于购物车方案,其中此事件可以指示订购是成功还是失败。如果已终止交易,则激发此事件。
• Page_CommitTransaction:如果已成功提交交易,则激发此事件。

 

新增的页面事件:
在ASP.NET 2.0中,一个ASP.NET页面的生命周期主要为(红色字体表示ASP.NET 2.0新增加的阶段页面事件):客户端请求页面—》预初始化(OnPreInit)—》初始化(OnInit)—》完成初始化(OnInitComplete)—》载入ViewState(LoadViewState)—》处理回送数据(IPostBackDataHandler)—》Page_OnPreLoad—》Page_OnLoad—》回发更改通知(RaisePostDataChangedEvent)—》处理回发事件(RaisePostBackEvent)—》Page_OnLoadComplete—》预呈现(OnPreRender)—》完成预呈现(OnPreRenderComplete)—》保存ControlState(SaveControlState)—》保存ViewState(SaveViewState)—》呈现(Render)—》Page_UnLoad。

OnPreInit:在初始化页面OnInit事件前触发。在这个阶段里,可以进行定义站点主题(Theme)或加载站点个性化所需要的数据信息等操作。
OnInitComplete:完成初始化页面OnInit事件后触发。
OnPreLoad:在加载页面OnLoad事件前触发。
OnLoadComplete:完成页面加载OnLoad事件后触发。
OnPreRenderComplete:在完成预呈现OnPreRender事件后触发。这是完成页面呈现的最后一道关卡,在此之后,页面将无法再进行任何呈现上的改动。
SaveControlState:保存控件状态ControlState。ControlState是ASP.NET2.0控件新增的一个属性,类似ViewState作用,但它们区别在于ControlState用于保存更加重要的控件状态信息,以保证在禁用ViewState的情况下还可以对控件状态进行读写操作。
增加对页面Header的控制:
System.Web.UI.Page类新增加了Header属性,用于对HTML页面头区域里数据的操作。通过对Header属性的跟踪,可以发现,Header属性保存着一个实现IPageHeader接口的对象(该对象有LinkedStyleSheets、Metadata、StyleSheet和Title四个属性),实际上正是通过这个对象实现对HTML页面头区域里数据的操作的。

 

OnPreInit示例:

实现功能:动态控制网站程序中服务器控件的外观。

实现步骤:

一在网站根目录下创建文件夹:App_Themes。这个文件夹名字不能改成别的。

二在App_Themes文件夹下创建子文件夹(主题),这个子文件夹名称就是页面的主题名称

三在主题下添加.css,.skin等文件.

四示例:

1 创建文件夹: App_Themes,在它下面添加两个主题: BlueTheme和RedTheme.

2 在BlueTheme下添加文件BlueTheme.skin,写入内容:

<asp:Button runat="server" BackColor="Blue" ForeColor="White" Font-Name="Arial" Font-Size="9px" />

3 在RedTheme下添加文件RedTheme.skin,写入内容:

<asp:Button runat="server" BackColor="Red" ForeColor="White" Font-Name="Arial" Font-Size="9px" />

4 HTML代码:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PageLife.aspx.cs" Inherits="PageLife" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

 

<title>无标题页</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

    <a href="PageLife.aspx?theme=Red" >red</a>

    <a href="PageLife.aspx?theme=Blue" >blue</a>

    <asp:Button ID="Button1" runat="server" Text="Button" />

    <asp:Button ID="Button2" runat="server" Text="Button" />

    </div>

    </form>

</body>

</html>

public partial class PageLife : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

    }

    ///<summary>

    ///预初始化方法,在用户控件和模板页里没有这个事件

    ///</summary>

    ///<param name="e"></param>

    protected override void OnPreInit(EventArgs e)

    {

        //参考http://msdn2.microsoft.com/zh-cn/library/tx35bd89(vs.80).aspx

        base.OnPreInit(e);

        switch (Request.QueryString["theme"])

        {

            case "Blue":

                Page.Theme = "BlueTheme";

                break;

            case "Red":

                Page.Theme = "RedTheme";

                break;

        }

    }

}

protected override void OnPreRender(EventArgs e)

1) 加入脚本

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            this.Page.RegisterClientScriptBlock("InsertText", this.RenderScript());
   this.Page.RegisterOnSubmitStatement("StorePostBody", "StorePostBody();");
        }


2) 设定标题
       

   protected override void OnPreRender(EventArgs e)
        {
            if(_mainTitle != null)
                _mainTitle.Text = ResourceManager.GetString(Title);

            if(_subTitle != null)
                _subTitle.Text = ResourceManager.GetString(SubTitle);

            base.OnPreRender (e);
        }

3) 设定按钮客户端事件


  protected override void OnPreRender(EventArgs e)
  {
   Submit.Attributes.Add("onclick", "return SubmitSendToFriend('" + From.ClientID + "', '" + To.ClientID + "');");
  }

4) 设定控件的状态

  protected override void OnPreRender(System.EventArgs e)
  {

    if(replyButton.Visible == false)
     ((Literal)FindControl("Sep1")).Visible = false;
    

    if(threadSubButton.Visible == false)
     ((Literal)FindControl("Sep3")).Visible = false;

    if(rateButton.Visible == false)
     ((Literal)FindControl("Sep2")).Visible = false;

   base.OnPreRender (e);

  }

5) 加入脚本块

  protected override void OnPreRender(EventArgs e)
  {
   base.OnPreRender (e);
   StringBuilder sb = new StringBuilder();
   sb.Append(" ");
   sb.Append("  function ToggleRateMenu() {");
   sb.Append("    rateMenu = document.getElementById('RateMenu');");
   sb.Append("    rateButton = document.getElementById('RateButton');");
   sb.Append("");
   sb.Append("    rateMenu.style.left = getposOffset(rateButton, \"left\");");
   sb.Append("    rateMenu.style.top = getposOffset(rateButton, \"top\") + rateButton.offsetHeight;");
   sb.Append("");
   sb.Append("    if (rateMenu.style.visibility == \"hidden\") {");
   sb.Append("      rateMenu.style.visibility = \"visible\";");
   sb.Append("      rateMenu.style.display = 'block';");
   sb.Append("    } else {");
   sb.Append("      rateMenu.style.visibility = \"hidden\";");
   sb.Append("      rateMenu.style.display = 'none';");
   sb.Append("    }");
   sb.Append("  }");
   sb.Append("  ");
   sb.Append("  function getposOffset(what, offsettype){");
   sb.Append("  var totaloffset=(offsettype==\"left\")? what.offsetLeft : what.offsetTop;");
   sb.Append("  var parentEl=what.offsetParent;");
   sb.Append("  while (parentEl!=null){");
   sb.Append("    totaloffset=(offsettype==\"left\")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;");
   sb.Append("    parentEl=parentEl.offsetParent;");
   sb.Append("  }");
   sb.Append("  return totaloffset;");
   sb.Append("}");
   sb.Append(" ");
   Page.RegisterClientScriptBlock("RatePost",sb.ToString());
  }


 

posted @ 2009-04-01 22:18  XGU_Winner  阅读(495)  评论(0编辑  收藏  举报