【问题标题】:ASP.NET event lifecycle for inherited user controls继承的用户控件的 ASP.NET 事件生命周期
【发布时间】:2011-01-21 05:16:49
【问题描述】:

请原谅伪代码,但这是一个简单的问题:

我创建了一个用户控件 (myControlBase : UserControl),其标记中有一个文本框 (id = "txtbox")。在它的代码隐藏中,我编写了一个方法 SayHello(string s){ txtbox.Text = s; }。

我创建了另一个扩展 myControlBase (myControl : myControlBase) 的用户控件。在这个子控件的 page_load 中,我调用 SayHello("hello");并收到一个运行时错误,告诉我 txtbox 为空(显然尚未创建)。

那么,我可以从用户控件继承并让我的子控件访问基本控件的标记吗?我试图阅读这些控件的事件生命周期,但我想我没有得到它。

有什么想法吗?

-编辑-

对不起,它是 ASP.Net。如果这段代码更清楚了,那么我在描述问题方面一定做得很差。

txtBox 是一个 ASP:Textbox 控件,存在于 myControlBase 的标记中。

public partial class myControlBase : System.Web.UI.UserControl
{
  protected void SayHello(string s){
    txtBox.Text = s;
  }
}

public partial class myControl: myControlBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
      SayHello("hello");
    }
}

这会在 SayHello("hello");因为 txtBox 返回 Null。

【问题讨论】:

  • 我假设你说的是 ASP.Net
  • 您能发布您的代码吗?
  • 哦。抱歉,ASP 不在我的权限范围内。

标签: c# asp.net user-controls page-lifecycle base-class


【解决方案1】:

我现在明白了这个问题,但我没有很好的解决方案。

当您像这样扩展用户控件时,您将完全无法访问基本控件的标记。子控件的 Page_Load 在(可能而不是?)基本控件的 Page_Load 之前调用。

【讨论】:

    【解决方案2】:

    除了Page_Load 等方法之外,还有On* 方法,例如OnInitOnLoad。这些是虚拟方法,因此可以被派生的用户控件覆盖。

    public override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        SayHello("hello");
    }
    

    【讨论】:

    • 您是对的,但这仍然不能解决无法通过子控件访问基本控件标记的问题。不错,OnLoad 会是一个更好的选择。
    • 好吧,如果您要扩展用户控件,最好能够访问该控件的标记。例如,如果您在基本用户控件中有一个文本框,您可能希望它的子类按照我上面的代码更改该文本框。
    • @caltrop:实际上,我不会那样做。我会让基类公开一个protected 属性,派生类可以使用它来设置基类中控件的属性。派生类不应该非常了解基类中的内容。
    【解决方案3】:

    看起来尚未调用 CreateChildControls。

    尝试在 Page_Load 中添加 EnsureChildControls(),或从 OnPreRender 事件中调用 SayHello。

    【讨论】:

    • 这些建议似乎都没有帮助。 =/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多