2013-02-13 2 views
2

У меня есть пользовательский элемент управления, который использует 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

+0

Я также добавил точки останова ко всем этим событиям. Когда код запускается (т.е. пользователь удаляет запись), это нормально. Я вижу ключ сеанса и набор данных и что они совпадают. Здесь нет путаницы. Это происходит только тогда, когда другие элементы управления обновляют панели. Затем в событии OnLoad я вижу, что оба ключа сеанса получают один и тот же набор данных – jason

ответ

2

Моя догадка заключается в том, что вы сохраняете свой myListOfObjects в сеансе, но повторно используете этот объект где-то и изменяете его и сохраняете его в Session снова с помощью другой ключ. Вероятно, это тот же объект, который хранится как для ключей Session.

Вы можете сделать простой тест, сохранив объект в Session с двумя разными ключами. Затем вытащите его с помощью первого ключа и измените этот объект и не переназначайте его обратно на Session (не обязательно в любом случае). Теперь вытащите другой объект из второго ключа и посмотрите на него. Он будет соответствовать модификациям, поскольку объект является тем же самым объектом, который хранится только под двумя разными ключами в Session.

+0

Спасибо за ответ. хотя верно, что я немного изменяю первоначальный список объектов (добавление/редактирование/удаление/переупорядочение) в списке myListOfObjects. Я всегда сохраняю его с идентификатором сеанса, как я выше написал, используя пользовательские элементы управления uniqueId. – jason

+0

@jason, но точка, о которой я говорю, является уникальным ключом, хранящим ссылку на тот же объект. Таким образом, вы можете выполнять сеансы ["A"] и 'Session [" B "]', но оба они сохраняют одну и ту же ссылку, поэтому, когда вы думаете, что имеете дело с версией 'A', вы фактически используете' B' также. Опять же, это просто догадка, основанная на том, как вы описали проблему. Можете ли вы опубликовать, как вы храните каждый объект 'Session' (показывая, что вы используете« новые »объекты) и как вы замечаете, что они смешиваются вместе. – Kelsey

+0

Да, я добавлю соответствующий код выше. Я вижу, что вы говорите, но я поставил точки останова на каждое событие и ни разу не видел, что вы описываете.Я знаю, что это происходит из-за этого сценария: как я уже сказал, элемент управления представляет собой таблицу с прикрепленным к ней datarepeater. Когда пользователь нажимает кнопку, им предлагается диалог для выбора значений. Эти значения добавляются (или удаляются) в ретранслятор. Когда я вношу изменения в один элемент управления, его панель обновления запускает и обновляет таблицу. Если событие заставляет другую таблицу обновляться, там появится такое же изменение. – jason

0

Если подозрение Келси верна, вы можете сохранить каждый экземпляр myListOfObjects в Dictionary(Of String, myListOfObjectsType) и использовать .UniqueID в качестве ключа (часть String).

Смежные вопросы