【问题标题】:Asp.NET Server Control PostbackAsp.NET 服务器控制回发
【发布时间】:2009-07-06 19:59:35
【问题描述】:

我有一个要创建的控件。这是我要完成的一个简单示例。

我希望控件包含一个按钮。

Button b = new Button();
b.Text = "Test";
b.Click += new EventHandler(b_Click);

this.Controls.Add(b);

现在,控件呈现正常,按钮显示在页面上。我遇到的问题的核心是 b_Click 事件处理程序永远不会被触发。

protected void b_Click(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

这里的任何帮助将不胜感激。出于纯粹的自私原因,我不想在这里使用用户控件,而是希望将其完全封装在单个 DLL 中。

提前致谢。

编辑**

namespace ClassLibrary1
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
    public class WebCustomControl1 : WebControl
    {

        protected override void CreateChildControls()
        {
            Button b = new Button();
                    b.ID = "button";
            b.Text = "Click Me";
            b.Click += new EventHandler(b_Click);

            this.Controls.Add(b);

            base.CreateChildControls();
        }

        protected void b_Click(object sender, EventArgs e)
        {
            this.Controls.Add(new LiteralControl("<p>Click!</p>"));
        }

    }
}

所以从我尝试过的 cmets 中。最简单的例子,还是不行。有什么我根本缺少的吗?

【问题讨论】:

    标签: c# asp.net events user-controls postback


    【解决方案1】:
    public class WebCustomControl1 : WebControl
    

    需要

    public class WebCustomControl1 : WebControl, INamingContainer
    

    就是这样。这就是使这个回发问题起作用所需的全部内容。

    【讨论】:

    • 这就是我所需要的——遇到了同样的问题
    【解决方案2】:

    覆盖 CreateChildControls 方法并在该方法中创建/添加按钮(并注册处理程序)。

    使用 OnInit/OnLoad 创建这样的控件是不正确的,并且会导致不一致的行为(例如您遇到的情况)。

    编辑:您也可以尝试设置 button.ID 以使其在每次回发时都相同,因此可能引发的事件没有看到它。

    【讨论】:

    • CreateChildControls 在 Control.Init 事件期间被调用。虽然覆盖 OnInit 可能是错误的(取决于您要做什么),但处理 Control.Init 不是。并且不要忘记调用 base.CreateChildControls 以确保您的基类已正确初始化。
    • CreateChildControls 可能在 Control.Init 期间被调用。但是,也可以从其他地方调用它(EnsureChildControls 可以在任何时候调用)。
    【解决方案3】:

    请显示您的控件类的定义。

    您的控件是否继承自 Control、WebControl 或 CompositeControl。尝试从 CompositeControl 继承,看看是否有帮助。

    【讨论】:

      【解决方案4】:

      所以您的按钮正确呈现到页面并在用户单击它时导致回发,但 OnClick 代码从未运行?

      请记住,每当您进行回发时,您都在使用页面类的全新实例。回发过程的一部分正在运行用户触发的任何事件。为此,asp.net 处理器需要了解页面生命周期中特定点的事件。 此时,您的按钮必须已经在注册了事件处理程序的页面上。如果这没有发生,您的事件将不会触发。尝试在页面生命周期的早期将按钮创建上移。

      【讨论】:

        【解决方案5】:

        这可能是在引发事件后很长时间分配处理程序的情况。

        我在处理控件时的常见做法是:

        1. 使用 Control.Init 事件来初始化所有内容(默认文本、处理程序、大小、合成等)并初始化子控件。
        2. 使用 Control.Load 事件处理任何数据绑定操作(基于 Init 事件期间设置的属性/字段)。

        【讨论】:

          【解决方案6】:

          在回发之前和回发之后检查按钮控件的标识符。如果不一样,那就不行了。

          如果需要,您可以自己覆盖标识符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-10
            • 1970-01-01
            • 2011-01-18
            • 1970-01-01
            • 1970-01-01
            • 2023-03-17
            • 1970-01-01
            相关资源
            最近更新 更多