2013-02-13 47 views
2

我有一个使用UpdatePanel的用户控件。这些控件基本上是一张Button的表格。当用户点击Button时,会打开一个模式弹出窗口,允许他们选择某个值。表(使用Repeater作为其DataSource)的数据作为对象列表存储在部分回发(发生时为UpdatePanel)之间的会话变量中。一切工作正常,如果我只有一个控件,但如果我多次在同一页面中使用此控件,会话变量中的对象列表会合并在一起,并且不会为每个控件分开。我想这可能是因为会话变量名称不是唯一的,所以无论我打电话或使用变量,我不喜欢这样写道:Asp.net会话变量混合起来

Dim sessionName as string = Me.UniqueID & "_" & "userNotificationDS" 
Session(sessionName) = myListOfObjects 

但是,这并没有改变结果。任何人都知道我可能在这里做错了什么?如果您认为完整的代码会有所帮助,请告诉我。

控制服务器代码:

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 2013-02-14 12:21:05

回答

2

我的预感是你正在存储您myListOfObjects的会议,但somwhere重用该对象并修改它,它在Session有再次存储不同的关键。它可能仍然是为Session键存储的相同对象。

您可以通过在Session中使用两个不同的键存储对象来进行简单的测试。然后使用第一个键将其拉出并修改该对象,不要将其重新分配回Session(反正不需要)。现在从第二个键中拉出另一个物体并观察它。它将匹配修改,因为对象是刚存储在Session中两个不同键上的同一个对象。

+0

感谢您的回应。虽然我确实修改了myListOfObjects列表中的对象的初始列表(添加/编辑/删除/重新排序),但我总是使用用户控件uniqueId将其保存为上面发布的会话标识。 – jason 2013-02-13 19:48:40

+0

@jason但我要说的是两个唯一键都存储对同一个对象的引用。所以你可以做Session [“A”]和'Session [“B”],但它们都存储相同的引用,所以当你认为你正在处理'A'版本时,你实际上正在使用'B'以及。再次,这只是基于你如何描述问题的预感。你可以发布你如何存储每个Session对象(显示你正在使用'new'对象)以及你如何注意到它们混合在一起。 – Kelsey 2013-02-13 22:01:57

+0

是的,我将添加上面的相关代码。我明白你在说什么,但是我已经在每个事件上都设置了断点,并且没有看到你描述的事情。我知道这是由于这种情况而发生的:正如我所说的,控件是一个附有datarepeater的表格。当用户点击一个按钮时,会显示一个对话框来选择值。这些值被添加(或删除)到中继器。当我在一个控件中进行更改时,更新面板会触发并更新表格。如果一个事件导致另一个表刷新,那么相同的改变将出现在那里。 – jason 2013-02-14 11:57:10

0

如果Kelsey的预感正确,可以将myListOfObjects的每个实例存储在Dictionary(Of String, myListOfObjectsType)中,并使用.UniqueID作为关键字(字符串部分)。