代码之家  ›  专栏  ›  技术社区  ›  Sheff

.NET页面事件触发顺序更改

  •  0
  • Sheff  · 技术社区  · 17 年前

    好吧,这是一个非常讨厌的虫子,我一上午都在和它发生问题!.

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

    通常,在回发时,会激发页面加载事件,然后激发页面上控件的CreateChildControls方法。

    奇怪的是,我们在站点上有一个登录系统(自定义成员资格提供程序),当一个用户登录到相反的站点时,首先会触发createChildControls()方法,然后页面加载,因此控件属性是错误的(从上一个回发设置)。

    这些事件怎么会以不同的顺序发生呢?我以为所有的页面事件都是以相同的顺序发生的,不管发生什么,我不知道登录会如何改变这个顺序。

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

    2 回复  |  直到 17 年前
        1
  •  4
  •   lingvomir    17 年前

    只要ASP.NET页需要,就调用CreateChildControls。在页面循环中没有特定的点。它可以发生在in it事件中,也可以发生在load事件中。如果要确保子控件可用,请调用控件的EnsureChildControls()方法。您可以在控件的in it事件中这样做,以确保在整个生命周期中都有子控件,也可以在需要引用某个子控件时这样做,例如在控件属性的getter/setter中。

        2
  •  1
  •   J S    17 年前

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

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

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

    推荐文章