VB.NET ASPX运行时为动态创建的Div添加脚本无法触发问题
问题根因与解决方案
核心错误
你的实现逻辑完全不符合ASP.NET Web Forms的服务端控件生命周期与事件绑定规则,这是事件无法触发的根本原因。
具体错误点
- 动态生成
<script runat="server">块完全无效:ASP.NET仅会在页面首次编译阶段解析处理服务端脚本,运行时动态插入的这类脚本、以及你存到静态文件里引用的VB代码,都不会被服务端引擎编译执行。 - 控件属性设置错误:ID、OnClick、runat、DescriptionUrl这些都是控件本身的属性,你全部错误添加到了
Style集合里,这些属性根本不会生效。 - 事件绑定逻辑错误:动态生成的服务端控件不需要为每个控件单独生成Click方法,直接绑定通用处理方法,通过Command参数传递业务值即可,你生成独立方法的逻辑没有可执行性。
- 循环逻辑错误:你用了双层循环遍历数据行,
For Each row里嵌套了For i = 0 to 行数-1,会导致每条记录被重复生成n次,属于冗余逻辑。 - 控件生命周期缺失:动态创建的服务端控件必须在每次页面回发时重新创建,否则回发后控件丢失,事件自然无法触发。
修正方案
第一步:删除冗余代码
删掉所有生成vbs文件、动态创建script标签的相关代码,这部分逻辑完全不需要。
第二步:修正动态控件创建与事件绑定逻辑
' 首先定义通用的ImageButton点击事件处理方法 Protected Sub MyIMG_Click(sender As Object, e As ImageClickEventArgs) Dim btn As ImageButton = CType(sender, ImageButton) Dim JobName As String = btn.DescriptionUrl Dim JobID As String = btn.CommandName Response.Redirect(String.Format("~/476.aspx?JobName={0}&JobID={1}", JobName, JobID)) End Sub Sub ThumbView() lbl_Status.Text = "ThumbView" ListPanel.Visible = False Dim MyTable As String = "[Estimate_Info4]" Dim Sql As String = "SELECT * FROM [Estimate_Info4]" Dim dbConnection = New SqlConnection(connString) Dim dbCommand = New SqlCommand(Sql, dbConnection) Dim data As New SqlDataAdapter(dbCommand) Dim table As New DataTable(MyTable) dbConnection.Open() data.Fill(table) ' 删掉外层的For Each,只保留一层循环 For i As Integer = 0 To (table.Rows.Count - 1) Try Dim row As DataRow = table.Rows(i) Dim NumberName As String = CStr(row("EstNumber")) & " " & CStr(row("JobName")) Dim CleanName As String = RemoveWhitespace(NumberName) Dim RecID As Integer = CInt(row("Id")) Dim RecID2 As String = CStr(row("Id")) ' 其余div、label等创建逻辑保留,这里只列ImageButton的修正部分 Dim MyIMG As ImageButton = New ImageButton() ' 注意:属性直接赋值,不要加到Style里 MyIMG.ID = CleanName MyIMG.DescriptionUrl = NumberName MyIMG.CommandName = RecID2 MyIMG.CssClass = "inner" MyIMG.ImageUrl = "~/Images/BLDG1.jpg" ' 绑定通用点击事件 AddHandler MyIMG.Click, AddressOf MyIMG_Click ' 其余控件添加逻辑不变 ' ..... 省略你原来的div、label创建添加代码 ..... Catch ex As Exception ' 注意:服务端不要用MsgBox,会弹出在服务器上,用户看不到 ' 可以改为存到lbl_Status显示错误 lbl_Status.Text = "遇到错误:" & ex.Message End Try Next Panel1.Style.Add("Height", "800px") Panel1.Style.Add("width", "1800px") Panel1.Style.Add("overflow", "scroll") Panel1.Style.Add("overflow-y", "Scroll") Panel1.Style.Add("overflow-x", "scroll") Panel1.Visible = True End Sub
第三步:修正页面调用逻辑
在Page_Load方法中调用ThumbView,每次页面加载(包括回发)都要执行,保证动态控件可以被重新创建,事件正常绑定:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not Page.IsPostBack Then ' 首次加载的其他逻辑 End If ' 每次加载都要执行,动态创建控件 ThumbView() End Sub
内容的提问来源于stack exchange,提问作者Mark Tarver
相关产品推荐
相关产品推荐

