ASP.NET生命周期 - 控制onLoad和RaisePostBackEvent

时间:2014-03-07 21:37:14

标签: c# asp.net

我正在维护一些较旧的C#代码,这些代码依赖于回发来保存数据。我很难理解生命周期中发生的事情。

似乎RaisePostBackEvent在任何表单控件onLoad事件运行之前正在运行。

例如,我在页面上有一个下拉列表和一个文本框。

下拉列表定义了以下处理程序

public class MyPage
{
    private void Page_Init(object sender, EventArgs e)
    {
        ddlDemo.SelectedIndexChanged += new EventHandler(ddlDemo_SelectedIndexChanged);
    }
}

文本框控件在onLoad事件中执行一些操作

public class MyTextBox: System.Web.UI.WebControls.TextBox
...
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        //do some stuff
    }
...
}

我的问题是dropdownlist处理程序在MyTextBox OnLoad事件之前运行。

根据MSDNCSharpcorner所描述的ASP.NET生命周期,(据我所知),事件的顺序应为

  1. 初始化
  2. 加载(控制属性加载了从视图状态和控制状态恢复的信息)
  3. 回发事件处理
  4. 我正在经历的是

    1. 初始化
    2. 页面加载
    3. 回发事件处理
    4. 控制OnLoad事件
    5. 有人可以向我解释为什么处理程序在任何控件OnLoad运行之前运行?

3 个答案:

答案 0 :(得分:1)

控件不会参与页面生命周期直到它被添加到页面的控件树中。一旦将它添加到Page的控制树中,它就会“赶上”(参见下面有关动态控件的文章)。您的控件是否已添加到页面的控件树中?你怎么知道的? (你没有发布相关代码,所以我不能确定。)

其次,阅读并理解这两篇文章,一般会对你有很大的帮助: Dynamic Controls Viewstate

顺便说一句,我在ASP.NET中生锈了但是当我还是初学者(我基本上还是这样)时,我的大部分问题都归结为以下两种情况之一:误解了视图状态或误解了控件如何参与页面生命周期。这就是我将以下两篇文章联系起来的原因,这两篇文章是我在这些主题上发现的最佳参考资料。

答案 1 :(得分:1)

我的ASP.Net生锈了。你可以尝试这个,移动一行:

ddlDemo.SelectedIndexChanged += new EventHandler(ddlDemo_SelectedIndexChanged);

Page_Load事件。这应该可以解决您的问题。

为什么你有{?1}}事件的特殊原因? Page_Init会在生命周期的早期和Page_Init事件之前触发。

答案 2 :(得分:0)

终于找到了问题。

ddlDemo.Load += new EventHandler(ddlDemo_SelectedIndexChanged);

在调试我想到的代码时,我正在查看SelectedIndexChanged事件。

这应该是(它看起来像是在某一点,但这段代码已有几年了)

ddlDemo.SelectedIndexChanged += new EventHandler(ddlDemo_SelectedIndexChanged);