0

好的,这是一个非常烦人的错误,我整个早上都遇到了问题!

我有一个自定义控件,我们在许多项目中都使用了该控件,该控件具有由调用页面 onload 设置并存储在 Viewstate 中的属性。该控件使用自定义控件的 CreateChildControls() 方法上的属性设置子控件。

通常像往常一样在回发时触发 Page_Load 事件,然后触发页面上控件的 CreateChildControls 方法。

奇怪的是,我们在网站上有一个登录系统(自定义成员资格提供程序),当用户登录时,相反的情况首先会触发 CreateChildControls() 方法,然后触发 Page_Load,因此控件属性是错误的(从之前的回发中设置) )

事件如何以不同的顺序触发?我认为无论如何所有页面事件都以相同的顺序发生,而且我看不到登录会如何改变该顺序。

更新:似乎问题是我没有调用 EnsureChildControls() 但我不确定应该在哪里调用它?如果在用于设置子控件的控件上设置了多个属性,我应该何时调用 EnsureChildControls(),我想我不完全理解 EnsureChildControls() 的作用?

4

2 回答 2

4

每当 ASP.NET 页面需要它们时,就会调用 CreateChildControls。在页面周期中没有特定的点。它可以发生在 Init 事件中,也可以发生在 Load 事件中。如果要确保子控件可用,请调用控件的 EnsureChildControls() 方法。您可以在控件的 Init 事件中执行此操作,以确保您在整个生命周期中都有子控件,或者您可以在需要引用其中一个子控件时执行此操作 - 例如,在控件属性的 getter/setter 中。

于 2009-05-07T12:29:31.600 回答
1

在创建需要访问包含的子控件的服务器/用户控件的属性时,我使用以下内容:

public Whatever SomeProperty
{

    get
    {
        EnsureChildControls();
        <more code here>
    }
    set
    {
        EnsureChildControls();
        <more code here>
    }
}

这确保您的控件使用者可以在页面生命周期的各个阶段自由地使用您的控件。

于 2009-05-07T15:28:23.467 回答