回发委托为空
本文关键字: | 更新日期: 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控件或自定义控件