ASP.NET动态生成的ImageButton服务端点击事件代码不触发问题
问题根因
你的实现逻辑存在本质错误:Page.ClientScript.RegisterClientScriptBlock 方法的作用是向最终输出到客户端浏览器的HTML文档中插入代码,插入带runat="server"的服务端VB代码没有任何意义——ASP.NET的服务端代码只会在页面编译、生命周期执行阶段解析,页面渲染阶段插入的服务端标记不会被编译执行,自然点击事件不会触发。
正确实现步骤
不需要动态注册服务端脚本块,直接在动态创建ImageButton的逻辑里绑定共用的点击事件即可,操作如下:
- 先在页面类中定义一个通用的点击事件处理方法:
Protected Sub DynamicImageButton_Click(sender As Object, e As ImageClickEventArgs) Dim currentBtn As ImageButton = CType(sender, ImageButton) Dim JobName As String = currentBtn.DescriptionUrl Dim JobID As String = currentBtn.CommandName Response.Redirect(String.Format("~/476.aspx?JobName={0}&JobID={1}", JobName, JobID)) End Sub
- 在循环创建ImageButton的逻辑中,给每个动态生成的按钮绑定上述通用事件:
' 循环内创建按钮的示例代码 Dim imgBtn As New ImageButton() imgBtn.ID = "immgbttn" & RecID imgBtn.DescriptionUrl = "当前行对应的JobName值" imgBtn.CommandName = "当前行对应的JobID值" ' 核心操作:绑定共用点击事件 AddHandler imgBtn.Click, AddressOf DynamicImageButton_Click ' 把按钮添加到父容器中 divleft.Controls.Add(imgBtn)
注意事项
- 动态创建的服务端控件,必须在每次页面回发(PostBack)时都重新创建,且控件ID要和首次创建时保持一致,否则事件会失效,建议把创建逻辑放在
Page_Init事件中执行。 - 不需要为每个按钮单独生成事件处理方法,通过
sender参数即可拿到触发事件的对应按钮实例,读取属性即可获取对应数据。
内容的提问来源于stack exchange,提问作者Mark Tarver
相关产品推荐
相关产品推荐

