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

标签 asp.net dynamic linkbutton

我正在将 LinkBut​​ton 控件动态添加到 PlaceHolder 中。如果我在每个 OnInit() 上添加 LinkBut​​ton 的新实例,则此 LinkBut​​ton 的 OnClick 处理程序将起作用。

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

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

顺便说一句 - 这是 1.1 中继承的应用程序,我刚刚迁移到 3.5。 “ splinter ”的方法似乎在 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);
}

最佳答案

有几件事:

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

2) 每个控件都会在每次回发时重新创建。我想您可能会认为每次重新创建 LinkBut​​ton 都很慢,但事实并非如此。

3) 为什么不能在回发时重新创建动态控件?这就是您应该使用动态控件执行的操作。整个想法是,您按照原来的方式设置页面,以便 ViewState 可以根据控件的 ID 自动连接到您的控件。如果您尝试在 Init() 之后的任何位置动态添加控件到页面,您将无法使用 ViewState 来处理您的控件数据,并且必须实现您自己的机制。

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

关于ASP.NET 动态添加的 LinkBut​​ton - OnClick 处理程序未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/855442/

相关文章:

c# - ZipArchive 在实时服务器上提供无效文件

asp.net - 具有动态内容的并排 Div

c# - ASP.NET 通知

ASP.NET Web API 将 http 响应转换为 json 数组

c# - 动态、linq 和 Select()

updatepanel - ASP .NET 在 UpdatePanel 内使用带有 UpdateProgress 的中继器

ios - 以编程方式在循环中添加带有 subview 的 View

c - 两个程序链接到动态链接库

c# - 将数据保存在文本框中,就像按 BACKSPACE 一样

c# - 如何在 LinkBut​​ton 单击事件上启动电子邮件客户端?