在ASP.net中是否有一个After Page_Load事件

Ian*_*oyd 36 asp.net page-lifecycle pageload

所有 Page_Load事件完成后是否会触发事件?

我怎么能有一个以上Page_Load
当您有用户控件时.

在我的页面可以渲染之前,我需要我的页面(以及所有嵌入式控件)通过完成他们的Page_Load事件来初始化自己.

当然,问题是如果我把代码放在我的页面Page_Load处理程序中:

MyPage.aspx
   --> Page_Load
          ---> DoSomethingWithUserControl()
UserControl1.ascx
   --> Page_Load
          ---> initialize ourselves now that viewstate has been restored
Run Code Online (Sandbox Code Playgroud)

然后我开始UserControl1在准备好之前访问我的控件.

我需要一种方法来所有Page_Load事件被触发运行代码,但任何回发事件(例如Click事件)被触发之前:

MyPage.aspx
   --> Page_Load
UserControl1.ascx
   --> Page_Load
          ---> initialize ourselves now that viewstate has been restored
MyPage.aspx
   --> Page_AfterLoad
          ---> DoSomethingWithUserControl()
Run Code Online (Sandbox Code Playgroud)

查看MSDN中的页面生命周期,看起来在完成所有Page_Loads 无法引发事件:

在此输入图像描述

有没有一种方法后,引发后,所有Page_Loads已经完成?

Jup*_*aol 61

Page_LoadComplete 是加载所有控件后引发的事件

请记住,Init事件首先由所有子控件触发,并且只有在初始化了所有控件时,Init才会引发页面事件.该Load事件的工作周围的其他方法,页面首先引发Load事件,然后每个子控件引发自己的Load事件.最后LoadComplete提出来了.请注意,只有在设计时创建控件时才会出现这种情况,当控件是动态创建时(遗憾的是)不严格遵循此方法.

来自MSDN:

如果控件是在运行时动态创建的,或者在数据绑定控件的模板中以声明方式创建,则它们的事件最初不会与页面上其他控件的事件同步.例如,对于在运行时添加的控件,Init和Load事件可能在页面生命周期的后期发生,而不是以声明方式创建的控件的相同事件.因此,从实例化它们开始,模板中动态添加的控件和控件会一个接一个地引发它们的事件,直到它们赶上将其添加到Controls集合中的事件.

看一看:

(来源:http://msdn.microsoft.com/en-us/library/ms178472.aspx)

在此输入图像描述

编辑1

为了满足您的所有要求:

我需要一种方法来在所有Page_Load事件被触发后运行代码,但在任何回发事件(例如Click事件)被触发之前:

我认为最简单的方法是在用户控件中声明一个自定义事件并在加载控件后触发它,然后jus在ASPX中订阅该事件

用户控制

    public event Action LoadCompleted = delegate { };

    protected void Page_Load(object sender, EventArgs e)
    {
        this.LoadCompleted();
    }
Run Code Online (Sandbox Code Playgroud)

ASPX页面

    protected void Page_Load(object sender, EventArgs e)
    {
        this.myUserControl.LoadCompleted += () => 
        {
            // do somethign interesting
            this.lblMessage.Text = DateTime.Now.ToString();
        };
    }
Run Code Online (Sandbox Code Playgroud)

  • 是的页面生命周期是棘手的,我个人讨厌,这是我喜欢MVC的原因之一 (2认同)