我正在根据服务器文件夹中显示的视频数量将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
答案 0 :(得分:1)
这是任何动态控件的旧ViewState问题,与视频无关。
请记住,每个回发将从头开始重建整个页面 ,包括动态控件。如果您仍然希望在回发后看到这些控件(包括所有服务器事件),则必须将它们重新添加到页面中。此外,如果要在此回发期间触发该控件的事件,则需要还原该控件的ViewState,并且要使该ViewState还原,必须在运行之前,将该控件添加回重建的页面中。 Page_Init或Page_PreInit可以很好地工作。
最后,在这里考虑性能影响。您真的要在每次用户互动时重新构建整个页面吗?或者也许是时候学习使用javascript处理这些事情了吗,也许使用一个Web api只需接收一个javascript请求而无需是否在您的服务器和用户浏览器中造成整个页面周期?
在许多其他场合中,只有几次被问及得到答案: