积极答复者
Page_Init的执行次数和时间?

问题
-
public partial class _Default : System.Web.UI.Page{private static int times=0;protected void Page_Init(object sender, EventArgs e){times++; //1Button1.Text = times.ToString(); //2test.Text += "Page_Init <hr>";Response.Write("<script>alert('I');</script>");}}代码如上所示。按照我从书上网络上得来的信息,init这个事件只会在第一次加载页面时触发。也就是说如果回调页面init这个函数不应该执行。但我发现,事实上这个函数还是执行了,但是在这个函数中对控件的修改无效,表面上看起来没有执行。假设我回调这个页面3次,然后重新加载页面,会发现times一直都有在累加。我想请教一下大家,这是为什么?
Felix- 已移动 Sheng Jiang 蒋晟Moderator 2011年8月18日 22:43 (发件人:ADO.NET 与 LINQ)
答案
全部回复
-
請問你在網路上看的訊息URL是什麼?有關ASP.NET網頁的生命週期,可以參考下列網址:
http://msdn.microsoft.com/zh-cn/library/ms178472(v=vs.80).aspx
如果你想要上述的程式碼只執行一次,可以用IsPostBack來判斷。
if (!IsPostBack) { times++; //1 Button1.Text = times.ToString(); test.Text += "Page_Init <hr>"; Response.Write("<script>alert('I');</script>"); }
以上說明若有錯誤請指教,謝謝。
http://www.dotblogs.com.tw/terrychuang/ -
PreInit和Init都只會執行一次,除非你每次都按F5或BROWSER的重新整理。當然就會時間一直變化,因為每次重新整理網頁就當作是第一次執行,因此INIT事件就重複被處理。
我把你所提供的網址上的範例調整一下,你可以試試看第一次執行時和按了BUTTON後的差異,應該有助於你了解ASP.NET網頁的生命週期。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm9.aspx.cs" Inherits="WebApplication1.WebForm9" %> <!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> <asp:Label ID="lbText" runat="server" Text=""></asp:Label> <asp:Button ID="Button1" runat="server" Text="Button" /> </div> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { public partial class WebForm9 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { lbText.Text += string.Format("Page_Load - IsPostBack={0} - {1}<hr> ",IsPostBack,DateTime.Now.ToString()); } protected void Page_PreInit(object sender, EventArgs e) { lbText.Text += string.Format("Page_PreInit - IsPostBack={0} - {1}<hr> ", IsPostBack, DateTime.Now.ToString()); } protected void Page_Init(object sender, EventArgs e) { lbText.Text += string.Format("Page_Init - IsPostBack={0} - {1}<hr> ", IsPostBack, DateTime.Now.ToString()); } protected void Page_PreLoad(object sender, EventArgs e) { lbText.Text += string.Format("Page_PreLoad - IsPostBack={0} - {1}<hr> ", IsPostBack, DateTime.Now.ToString()); } protected void Page_PreRender(object sender, EventArgs e) { lbText.Text += string.Format("Page_PreRender - IsPostBack={0} - {1}<hr> ", IsPostBack, DateTime.Now.ToString()); } } }
以上說明若有錯誤請指教,謝謝。
http://www.dotblogs.com.tw/terrychuang/ -
不知道你看的是哪本书/网络看到的信息。
Page_Init其实是页面的Init事件处理方法,Init事件无论是否是回发,都会被引发,因而Page_Init无论是首次加载还是回发,都会运行。
Init事件引发的时候,页面上的控件都还“没有加载好”,或者说也都在初始化阶段,这时候你给Button 的 Text属性赋值会被后期的ViewState恢复等操作覆盖掉。
最后,你的times变量是静态变量,这意味着,只要站点程序没有被彻底关掉,这个变量就会一直存在,而跟类的具体实例的产生或者销毁无关,因为静态变量属于“类型”而非类型的实例。
理解的越多,需要记忆的就越少 -
其實都是會執行的哦!
在畫面上放個Button及Label,
<asp:Button ID="Button1" runat="server" Text="Button" />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
public partial class _Default : System.Web.UI.Page { private string eventTrace = string.Empty; protected void Page_Load(object sender, EventArgs e) { eventTrace += string.Format("Page_Load - IsPostBack={0} - {1}<hr> ", IsPostBack, DateTime.Now.ToString()); } protected void Page_PreInit(object sender, EventArgs e) { eventTrace += string.Format("Page_PreInit - IsPostBack={0} - {1}<hr> ", IsPostBack, DateTime.Now.ToString()); } protected void Page_Init(object sender, EventArgs e) { eventTrace += string.Format("Page_Init - IsPostBack={0} - {1}<hr> ", IsPostBack, DateTime.Now.ToString()); } protected void Page_PreLoad(object sender, EventArgs e) { eventTrace += string.Format("Page_PreLoad - IsPostBack={0} - {1}<hr> ", IsPostBack, DateTime.Now.ToString()); } protected void Page_PreRender(object sender, EventArgs e) { eventTrace += string.Format("Page_PreRender - IsPostBack={0} - {1}<hr> ", IsPostBack, DateTime.Now.ToString()); Label1.Text = eventTrace; } }
結果如下,第1次都postback=false及true都是會執行的哦!
以下的參考比較詳細哦!
ASP.NET Application and Page Life Cycle
亂馬客blog: http://www.dotblogs.com.tw/rainmaker/- 已建议为答案 TerryChuang 2011年8月18日 8:02