ASP.NET动态添加了LinkBut​​ton - 未调用OnClick处理程序

Art*_*Art 2 asp.net dynamic linkbutton

我将一个LinkBut​​ton控件动态添加到PlaceHolder中.如果我在每个OnInit()上添加一个新的LinkBut​​ton实例,那么此LinkBut​​ton的OnClick处理程序可以正常工作.

但是,如果我在会话中存储LinkBut​​ton的实例,然后将其添加到PlaceHolder的控件集合中,则LinkBut​​ton.OnClick将无法触发.

有没有办法在给定的场景中重用我在会话中存储的控件?每次重新创建它们都不是一种选择.

正如旁注 - 它是1.1中的继承应用程序,我刚刚迁移到3.5."破碎"的方法似乎在1.1中起作用.

感谢所有的答案.

public static void Clicked(object sender, EventArgs e) {
    Debugger.Break();
}

protected override void OnPreInit(EventArgs e) {
    base.OnPreInit(e);
    InitLinkButton();
}

private void InitLinkButton() {    
    var lb = new LinkButton();
    plOne.Controls.Add(lb);
    lb.ID = "lb";
    lb.Text = "I will work.";
    lb.Click += Clicked;
    plOne.Controls.Add(lb);

    LinkButton lb2 = null;
    if (Session["lb2"] == null) {
        lb2 = new LinkButton();
        lb2.ID = "lb2";
        lb2.Text = "I won't work.";
        lb2.Click += Clicked;
        Session["lb2"] = lb2;
    } else {
        lb2 = (LinkButton)Session["lb2"];
    }
    plOne.Controls.Add(lb2);
}
Run Code Online (Sandbox Code Playgroud)

wom*_*omp 10

几件事:

1)永远不要将WebControl的实例存储到Session.每个WebControl都有一个对象的引用 - 当然它引用了每一个其他的WebControl.只要将WebControl存储到Session中,就基本上存储整个页面及其包含的所有内容.你正在通往内存泄漏城市的高速公路上.

2)每次回发都会重新创建每个控件.我想你可能会认为每次重新创建你的LinkBut​​tons都很慢,但事实并非如此.

3)为什么不在回发选项上重新创建动态控件?这就是你应该用动态控件做的事情.整个想法是您将页面设置为与原来相同,以便ViewState可以根据其ID自动连接到您的控件.如果您尝试在Init()之后的任何位置动态地向页面添加控件,您将无法使用ViewState来处理控件数据,并且必须实现自己的机制.

我的建议是在Init()中重新创建动态控件 - 这是最佳实践.