Событие 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, не вызывая весь цикл страницы на ваш сервер и в браузере пользователя?

Лишь несколько из многих других случаев, когда об этом спрашивали и отвечали:

Другие вопросы по тегам