Событие onended не сработает для динамически добавленного элемента управления htmlvideo.
Я динамически добавляю элементы управления htmlvideo в свою веб-форму в зависимости от количества видео, присутствующих в папке на сервере. Эта часть отлично работает. Все видео появляются и могут быть воспроизведены. Я добавляю событие "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
1 ответ
Это старая проблема ViewState для любого динамического элемента управления, и она не имеет ничего общего с видео.
Помните, что каждый PostBack восстанавливает всю страницу с нуля, включая ваши динамические элементы управления. Если вы все еще хотите видеть эти элементы управления после обратной передачи (которая включает в себя все события сервера), вы должны повторно добавить их на страницу. Кроме того, вам необходимо восстановить ViewState элемента управления, если вы хотите, чтобы событие срабатывало для элемента управления во время этого PostBack, а для восстановления ViewState элемент управления должен быть добавлен обратно на восстановленную страницу до запуска события Page_Load. Page_Init или Page_PreInit могут хорошо работать для этого.
Наконец, рассмотрим последствия для производительности здесь. Вы действительно хотите перестроить всю страницу при каждом взаимодействии с пользователем, или, возможно, пришло время научиться использовать javascript для обработки этих вещей, возможно, с помощью веб-интерфейса API, который должен только получать запрос javascript, не вызывая весь цикл страницы на ваш сервер и в браузере пользователя?
Лишь несколько из многих других случаев, когда об этом спрашивали и отвечали:
- Динамический обработчик событий не запускается
- динамически добавленные кнопки не запускают событие клика C#
- динамически создаваемое событие нажатия кнопки не срабатывает
- Динамически добавленные DropDownlists не запускаются SelectedIndexChanged Event
- ASP.NET: Viewstate и программное добавление пользовательских элементов управления
- События кликов на массиве кнопок
- Динамическое нажатие кнопки VB ASP не затрагивает событие обработчика