asp.net - 事件不会触发动态添加的控制
问题描述
我正在根据服务器文件夹上存在的视频数量动态地将 htmlvideo 控件添加到我的 Web 表单中。这部分工作正常。所有视频都会显示并且可以播放。我在后面的代码中添加了“onended”事件作为属性和函数,但是这个事件不会触发。我知道,由于这些控件是在我必须添加一个侦听器之后添加的,但只是不知道如何。
这是添加控件的代码
Dim SavePath As String = "e:\ftproot\images\TechNet\"
Dim Directory As New DirectoryInfo(SavePath)
Dim allFiles As IO.FileInfo() = Directory.GetFiles("*.mov")
Dim VidCtr As Integer = 1
For Each singlefile In allFiles
Dim myVid As New HtmlVideo
myVid.Src = "https://www.rawauto.com/images/TechNet/" & singlefile.Name
myVid.Attributes.Add("height", 140)
myVid.Attributes.Add("runat", "server")
myVid.Attributes.Add("type", "video/mp4")
myVid.Attributes.Add("controls", "controls")
myVid.Attributes.Add("onended", "VidPlayed")
myVid.Attributes.Add("id", "Vid" & VidCtr)
Panel1.Controls.Add(myVid)
Dim myLbl As New Label
myLbl.Text = Replace(UCase(singlefile.Name), ".MOV", "")
myLbl.Width = 250
myLbl.CssClass = "VidStyle"
myLbl.Font.Name = "calabri"
myLbl.Font.Bold = True
LPanel.Controls.Add(myLbl)
Next
这是用户观看完视频后我试图触发的功能:
Protected Sub VidPlayed(sender As Object, e As EventArgs)
Dim Tech As New SqlConnection("server=RAW-OTT; Initial Catalog=TechNet; Integrated Security=True;")
Dim vid As HtmlVideo = sender
Dim vidurl As String = vid.Src
VidName = Replace(vidurl, "https://www.rawauto.com/images/TechNet/", "")
If Len(VidName) > 50 Then
VidName = Mid(VidName, 1, 50)
End If
Dim SqlStr As String = "Select * From TechTube Where Video = '" & VidName & "'"
Dim ttA As New SqlDataAdapter(SqlStr, Tech)
Dim ttT As New DataTable
ttA.Fill(ttT)
If ttT.Rows.Count = 0 Then
SqlStr = "Insert Into TechTube Values ('" & VidName & "', 1, 0)"
Dim tCmd As New SqlCommand(SqlStr, Tech)
Tech.Open()
tCmd.ExecuteNonQuery()
Tech.Close()
Else
SqlStr = "Update TechTube Set Hits = Hits + 1 Where Video = '" & VidName & "'"
Dim tCmd As New SqlCommand(SqlStr, Tech)
Tech.Open()
tCmd.ExecuteNonQuery()
Tech.Close()
End If
RateLabel.Visible = True
RatingBox.Visible = True
End Sub
解决方案
对于任何动态控件来说,这都是一个古老的 ViewState 问题,与视频无关。
请记住,每个 PostBack 都会从头开始重建整个页面,包括您的动态控件。如果在回发(包括所有服务器事件)后仍希望看到这些控件,则必须将它们重新添加到页面中。此外,如果您希望在此 PostBack 期间为控件触发事件,则需要恢复控件的 ViewState,并且必须在 Page_Load 事件运行之前将要恢复控件的 ViewState 添加回重建的页面。Page_Init 或 Page_PreInit 可以很好地解决这个问题。
最后,考虑这里的性能影响。您是否真的想在每次用户交互时重建整个页面,或者是时候学习使用 javascript 来处理这些事情了,也许 Web api 只需要接收 javascript 请求而不会导致整个页面循环你的服务器和用户的浏览器?
这只是被问及回答的许多其他时间中的几个:
推荐阅读
- postgresql - 基于join的PostgreSQL更新查询
- amazon-web-services - 如何配置使用复合属性为我的 dynamodb 表创建分区键
- python - 发送对象数组时出错。OpenAPI、连接、烧瓶
- xaml - 如何根据 xaml 中的窗口大小动态更改文本和图像的位置
- java - ITextpdf 不适用于来自 html 的波兰语/捷克语字母
- solr - 当我们有两种不同类型的字段时,分数问题
- reactjs - 如何使用 Jest 和 React 测试库测试 React 的错误边界
- java - 如何在 Apache HttpClient 5.1 中跟踪 POST 的重定向
- python - 将具有不同数量的逗号分隔符的字符串转换为 pandas 中的列
- python - 附加具有不同第一个有效索引的列