ASP.NET Нажатие кнопки не зафиксировано (кнопка в пользовательском элементе управления, которая динамически загружается в Repeater)
Я написал пользовательский элемент управления, который фиксирует некоторый пользовательский ввод и имеет кнопку Сохранить, чтобы сохранить его в БД. Я использую повторитель для отображения ряда этих элементов управления на странице - представьте список вопросов с несколькими вариантами ответов с кнопкой "Сохранить" для каждого вопроса.
Я загружаю пользовательский элемент управления в событие ItemDataBound повторителя, как это (код упрощен):
Protected Sub rptAssignments_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptAssignments.ItemDataBound
Dim CurrentAssignment As Assignment = DirectCast(e.Item.DataItem, Assignment)
Dim ctl As UA = CType(LoadControl("~\Controls\UA.ascx"), UA)
ctl.AssignmentID = CurrentAssignment.AssignmentID
ctl.Assignment = CurrentAssignment.AssignmentName
ctl.EnableViewState = True
e.Item.Controls.Add(ctl)
End Sub
К вашему сведению, мне нужно загрузить элемент управления во время выполнения, а не указывать его в ItemTemplate, потому что для каждой строки можно использовать разные элементы управления.
В пользовательском элементе управления есть кнопка ссылки, подобная этой:
<asp:LinkButton ID="lbnUpdate" runat="server" Text="Update" OnClick="lbnUpdate_Click" />
... и обработчик нажатия кнопки, например:
Protected Sub lbnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lbnUpdate.Click
' my code to update the DB
End Sub
Проблема в том, что когда нажата кнопка "Сохранить", страница отправляется обратно, но lbnUpdate_Click не вызывается. Однако вызывается событие Page_Load самой страницы.
Я должен упомянуть, что повторитель является частью пользовательского элемента управления, и этот элемент управления загружается внутри другого пользовательского элемента управления (это сайт DotNetNuke, который интенсивно использует пользовательские элементы управления). Ссылка на кнопку Сохранить выглядит следующим образом:
javascript:__doPostBack('dnn$ctr498$AssignmentsList$rptAssignments$ctl04$ctl00$lbnUpdate','')
3 ответа
Эта проблема иллюстрирует то, как webforms превосходит себя.
Вы должны восстановить Repeater, либо путем повторной привязки, либо из состояния представления, чтобы под-элементы управления вызывали события. Цена, которую вы платите - это либо еще одна поездка к вашему источнику данных, либо все эти избыточные данные, хранящиеся на клиенте в viewstate. Стыдно!
Однажды у меня была похожая проблема, которая могла бы быть такой же.
Короче говоря, поскольку вы динамически создаете кнопки, после обратной передачи они не существуют. Таким образом, когда ASP.NET Webforms ищет событие, он не может ничего найти.
Когда ваш ретранслятор получает данные? Попробуйте отобразить кнопки на странице еще раз в постбэке (даже в качестве теста), чтобы увидеть, справится ли это с задачей.
Одинаковые ли идентификаторы UserControl на каждой обратной передаче?