asp.net页执行开始到结束有执行了哪些事件顺序是怎样的
Page 执行中将按照如下顺序激活事件:
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—》回发更改通知(RaisePostDataChangedEven
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());
}