回发委托为空

本文关键字: | 更新日期: 2023-09-27 18:15:20

我正在用自定义事件构建服务器控件,并作为示例使用此MSDN参考。但是事件不会在postback时被触发——clickEventDelegate总是null:

      if (clickEventDelegate != null)
      {
            clickEventDelegate(this, e);
      }
下面是我添加委托的方法:
     if (!Page.IsPostBack)
     {
          .....
         MYCONTROL.LeftClick+= FUNCTION;
     }

任何想法?

回发委托为空

您没有发布足够的代码来找出事件为空的原因。但是我要列出标准模式。

这是你如何定义自定义事件的参数类:

public class MyEventArgs : EventArgs
{
    private string MyField { get; private set; }
    public MyEventArgs(string myField)
    {
        MyField = myField;
    }
}

定义自定义事件的方法如下:

public event EventHandler<MyEventArgs> MyEvent;

在同一个类中编写事件触发器:

protected virtual void OnMyEvent(MyEventArgs e)
{
    EventHandler<MyEventArgs> myEvent = MyEvent; // for thread safety
    if (myEvent != null)
    {
        myEvent(this, e);
    }
}

在定义事件的类(或派生类)中如何引发事件:

OnMyEvent(new MyEventArgs("Test"));

这是你在派生类中对事件的反应:

protected override void OnMyEvent(MyEventArgs e)
{
    // TODO: Here you react to your event.
    base.OnMyEvent(e);
}

这是在外部类中注册事件的方式:

otherClass.MyEvent += delegate(object sender, EventArgs e)
{
    // TODO: Here you react to your event.
};

另一个答案只是解释了事件是如何工作的,但完全忽略了问题的要点:在回发期间Delegate是null

答案很简单。只要每次订阅你的事件,甚至在Postback期间,所以你只需要删除你的条件if (!Page.IsPostBack)

MYCONTROL.LeftClick+= FUNCTION;

我知道这是一个非常古老的问题,你不可能还在寻找答案。但是当我读

您没有发布足够的代码来找出事件的原因空

从上一个答案我不能让这个错误的陈述像这样。

编辑:

要添加更多的解释,每次服务器返回要在浏览器中呈现的最终页面时,它都会丢失此特定连接的状态。想象一下,如果服务器应该将所有连接及其相关状态保存在内存中,那么您每天可能有数千个用户,并且何时"清理"这些内存?

所以不,这将是不可行的,这就是为什么他们创建了ViewState,这样浏览器可以发送以前的信息到服务器。然而,这个ViewState可以保存一些变量或对象的值,但不保存事件和它的委托之间的绑定。

回到具体例子。如果你这样做

<asp:Button runat="server" ID="ButtonTest" OnClick="buttonTest_Click" Text="test" />

事件的订阅是由ASP在内部进行的。在到达页面的Page_Load之前,在生命周期的非常早期阶段。NET。您可以阅读ASP。. NET生命周期这里

如果您像这样分配事件处理程序

<asp:Button runat="server" ID="ButtonTest" Text="test" />

和服务器端:

protected void Page_Load(object sender, EventArgs e)
{
    ButtonTest.Click += ButtonTest_Click;
}

它的工作原理是一样的,只是订阅的时间稍晚一些。

但是如果你用条件

来修饰它
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ButtonTest.Click += ButtonTest_Click;
    }
}

这不起作用,因为事件处理程序尚未分配。请记住,您的服务器忘记了这个特定连接的状态,并且必须在每个HTTP POST请求(PostBack)中初始化所有内容。

这与您的问题的示例代码完全相同,因此您可以看到事件在本机ASP上工作相同。. NET控件或自定义控件

相关文章:
  • 没有找到相关文章