none
Page_Init的执行次数和时间? RRS feed

  • 问题

  • public partial class _Default : System.Web.UI.Page
    {
        private static int times=0;
        protected void Page_Init(object sender, EventArgs e)
        {
            times++; //1
            Button1.Text = times.ToString(); //2
            test.Text += "Page_Init <hr>";
            Response.Write("<script>alert('I');</script>");
        }
    }
    代码如上所示。按照我从书上网络上得来的信息,init这个事件只会在第一次加载页面时触发。也就是说如果回调页面init这个函数不应该执行。但我发现,事实上这个函数还是执行了,但是在这个函数中对控件的修改无效,表面上看起来没有执行。假设我回调这个页面3次,然后重新加载页面,会发现times一直都有在累加。我想请教一下大家,这是为什么?

    Felix
    2011年8月18日 3:48

答案

  • 是的,每次都会执行。这方面和Page_Load是一个概念,只是Page_Init要早于Page_Load。在ASP.NET生命周期中,楼主要遵循每个生命周期中的事件所应该做的事情。Init就做一些页面和控件初始化的事情,比如在Page_Init中添加页面动态创建的控件等,而在Page_Load中做一些Load时该做的事情,比如为你的Button的Text重新赋值等。

    理解的越多,需要记忆的就越少
    • 已标记为答案 felix9 2011年8月18日 7:31
    2011年8月18日 7:30
    版主

全部回复

  • 請問你在網路上看的訊息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/
    2011年8月18日 6:00
  • 调用IsPostBack这个我清楚。我只是在这个网页http://hi.baidu.com/yy3b2007com/blog/item/2037b9092386f1a62fddd4f7.html和一本书上看到关于Page_Init的描述觉得奇怪,然后自己验证后却和他们讲的不一致,所以发帖请教一下。

    按照我trace后的记录来看,应该是无论是不是回调这些事件都会发生,只是关于控件的操作不一定有效,对吗?


    Felix
    2011年8月18日 6:12
  • 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/
    2011年8月18日 6:47
  • 不知道你看的是哪本书/网络看到的信息。

    Page_Init其实是页面的Init事件处理方法,Init事件无论是否是回发,都会被引发,因而Page_Init无论是首次加载还是回发,都会运行。

    Init事件引发的时候,页面上的控件都还“没有加载好”,或者说也都在初始化阶段,这时候你给Button 的 Text属性赋值会被后期的ViewState恢复等操作覆盖掉。

    最后,你的times变量是静态变量,这意味着,只要站点程序没有被彻底关掉,这个变量就会一直存在,而跟类的具体实例的产生或者销毁无关,因为静态变量属于“类型”而非类型的实例。



    理解的越多,需要记忆的就越少
    2011年8月18日 6:56
    版主
  • 版主你好。

    按您的意思,就是init里面的代码每次都会执行是吧,只是和因为控件还没有加载好,所以对控件的修改都会无效是吗?


    Felix
    2011年8月18日 7:04
  • 我trace了一下,发现,init是有执行的啊,你举的这个例子里面有对控件的操作,所以有些操作没有起作用。

    Felix
    2011年8月18日 7:06
  • 是的,每次都会执行。这方面和Page_Load是一个概念,只是Page_Init要早于Page_Load。在ASP.NET生命周期中,楼主要遵循每个生命周期中的事件所应该做的事情。Init就做一些页面和控件初始化的事情,比如在Page_Init中添加页面动态创建的控件等,而在Page_Load中做一些Load时该做的事情,比如为你的Button的Text重新赋值等。

    理解的越多,需要记忆的就越少
    • 已标记为答案 felix9 2011年8月18日 7:31
    2011年8月18日 7:30
    版主
  • 谢谢版主!
    Felix
    2011年8月18日 7:31
  • 其實都是會執行的哦!

    在畫面上放個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/
    2011年8月18日 7:54
  • 不好意思,之前的貼圖有點錯誤,容我把它刪除,Page Init的確每次POSTBACK都會執行,你所問到的在Page Init中對Button設定Text屬性看似無效,是因為Button的Control State的關係,有個簡單的方式可以實驗,你把Button1的EnableViewState設為false,就可以看出Page Init每次都會執行了。
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年8月18日 8:39