У меня есть пользовательский элемент управления, который использует UpdatePanel
. Элементы управления по существу представляют собой таблицу с номером Button
. Когда пользователь нажимает кнопку Button
, открывается модальное всплывающее окно, которое позволяет им выбирать некоторое значение. Данные для таблицы (которая использует Repeater
как ее DataSource
) хранятся в переменной сеанса между частичными обратными передачами (когда UpdatePanel
запускается) в виде списка объектов. Все работает нормально, если у меня есть только один элемент управления, но если я использую этот элемент управления на одной странице более одного раза, список объектов в переменных сеанса объединяется и не разделяется для каждого элемента управления. Я думал, что это может быть потому, что имена переменных сеанса не являются уникальными, поэтому в любом месте я называю или использовать переменную, я делаю это так:Переменные сеанса Asp.net перепутаны
Dim sessionName as string = Me.UniqueID & "_" & "userNotificationDS"
Session(sessionName) = myListOfObjects
Но это не изменило исход. Кто-нибудь знает, что я могу делать неправильно здесь? Если вы считаете, что полный код будет полезен, сообщите мне.
Control Code Сервер:
Protected Sub delete_click(ByVal sender As Object, ByVal e As EventArgs)
Dim btn As LinkButton = CType(sender, LinkButton)
Dim ds As New List(Of myObject)
sessionName = Me.UniqueID & "_" & "myDataSet"
ds = Session(sessionName.ToString)
Dim id As String = btn.CommandArgument
ds.RemoveAll(Function(userNotification) userNotification.User.NetworkID.Equals(id))
Session(sessionName.ToString) = ds
bindData(ds)
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
sessionName = Me.UniqueID & "_" & "myDataSet"
If (Session(sessionName.ToString) IsNot Nothing) Then
bindData(Session(sessionName.ToString))
End If
End Sub
Private Function buildPagedSet(ByVal userNotification As List(Of myObject)) As PagedDataSource
Dim ps As PagedDataSource = New PagedDataSource()
ps.DataSource = userNotification
ps.AllowPaging = True
ps.PageSize = numRows
Return ps
End Function
Public Sub bindData(ByVal commentList As List(Of myObject))
sessionName = Me.UniqueID & "_" & "myDataSet"
Dim currentPage As Integer = 0
Dim ps As PagedDataSource
Dim numLable As Label
Dim denomLable As Label
Dim curPage As Integer = 1
Dim totalPage As Integer = 0
If (Not myObject Is Nothing) Then
Try
ps = buildPagedSet(commentList)
totalPage = ps.PageCount
Session(sessionName.ToString) = commentList
rowTotal = ps.Count
'for paging
If Not (ViewState(Me.UniqueID & "_Page") Is Nothing) Then
currentPage = Convert.ToInt32(ViewState(Me.UniqueID & "_Page"))
Else
ViewState(Me.UniqueID & "_Page") = 1
currentPage = 1
End If
If (currentPage > 0 And currentPage <= ps.PageCount) Then
ps.CurrentPageIndex = currentPage - 1
Me.dataRepeateUsers.DataSource = ps
Me.dataRepeateUsers.DataBind()
ElseIf (currentPage >= ps.PageCount) Then
ViewState(Me.UniqueID & "_Page") = Convert.ToInt32(ViewState(Me.UniqueID & "_Page")) - 1
ElseIf (currentPage <= 0) Then
ViewState(Me.UniqueID & "_Page") = Convert.ToInt32(ViewState(Me.UniqueID & "_Page")) + 1
Else
End If
Catch ex As Exception
Throw
End Try
Else
Dim emptySet As New List(Of myObject)
Me.dataRepeateUsers.DataSource = emptySet
Me.dataRepeateUsers.DataBind()
End If
End Sub
управления конкретизируется следующим образом:
Me.notifier1.bindData(notificationList)
В этом примере, когда пользователь удаляет что-то из notifier1 (событие delete_click) объект удаляется из список, и он добавляется обратно в сеанс. Если что-нибудь заставляет панель обновления notifier2 загореться, она будет отображать те же точные данные, что и notifier1
Я также добавил точки останова ко всем этим событиям. Когда код запускается (т.е. пользователь удаляет запись), это нормально. Я вижу ключ сеанса и набор данных и что они совпадают. Здесь нет путаницы. Это происходит только тогда, когда другие элементы управления обновляют панели. Затем в событии OnLoad я вижу, что оба ключа сеанса получают один и тот же набор данных – jason