【问题标题】:Method Order Between Parent and Inner UserControls父用户控件和内部用户控件之间的方法顺序
【发布时间】:2013-01-09 20:31:26
【问题描述】:

我正在开发一个项目,它有一个名为 Outer 的外部 UserControl,它执行一些逻辑来确定在其代码中静态加载哪个内部 UserControl。有几个内部控件,我们称它们为 Inner1Inner2Inner3

所有内部控件都继承外部控件,所以:

Outer : System.Web.UI.UserControl

Inner1 : Outer

Inner2 : Outer

Inner3 : Outer

Outer.cs我有一些内部控件可以访问的字段和方法,例如

List<string> foo = null;

protected void Page_Load(object sender, EventArgs e)
{
    
}

public void DoStuff()
{
    foo = MethodToPopulateFoo(); // this always works and returns a List<string> even if its empty
    // other stuff here
}

现在,这是我的问题:如果我在 Page_LoadOuter 中调用 DoStuff(),我希望它运行,将 foo 设置为一个列表,foo 不再是 null。然后当任何内部控件的Page_Load运行时,每个控件都可以访问foo,而不是null

这不会发生。相反,在Inner1Inner2Inner3 中的任何Page_Load 中——当我访问foo 时,它始终是null。但是,当页面在浏览器中加载时,OuterPage_Load 完全执行,然后InnerXPage_Load 加载,所以我很困惑为什么foo 再次是null调用内部控件的Page_Load,我知道它在外部控件之后运行(设置foo)。

如果我要从外部Page_Load 中删除DoStuff() 调用并进入每个单独的内部Page_Load,它工作正常。不过我想避免这种情况。

【问题讨论】:

  • 仅供参考,就生命周期或方法顺序而言,用户控件没有什么特别之处。它们与所有其他类型的控件相同。

标签: c# asp.net inheritance webforms page-lifecycle


【解决方案1】:

内部控件的Page_Load方法在外部控件的Page_Load之前被调用。但您仍有两种选择:

您可以使用延迟初始化,例如

List<string> _foo;
List<string> Foo
{
   get 
   {
      if (_foo == null)
         _foo = new List<string>();
      return _foo;
   }
}

或者你在你的外部控件中初始化 foo (每个类都应该初始化它自己的对象)并且不是从 Page_Load 访问它,而是从你的内部控件中的 Page_PreRender 访问它。您也可以在 Page_Init 或 Page_PreLoad 中创建列表。

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多