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# - 使 LinkBut​​ton 显示为超链接的样式

asp.net - 从 ASP.NET MVC 4 中的部分或编辑器模板触发包包含

asp.net - 按钮已禁用但看起来处于事件状态

javascript - 如何将 jquery .data 与动态添加的元素一起使用

javascript - 在动态生成的 DOM 上取消初始化/重新初始化 tinyMCE

c# - 动态添加的 LinkBut​​ton CommandName/CommandArgument 设置被删除

c# - 缓存页面的仅限管理员内容

c# - Linq自连接查询

c - 这里出了什么问题? [动态结构 C]

javascript - 使用jQuery在mouseenter上触发asp.net linkbutton的点击事件