Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net会话变量混淆了_Asp.net_Vb.net_Session_User Controls_Session Variables - Fatal编程技术网

Asp.net会话变量混淆了

Asp.net会话变量混淆了,asp.net,vb.net,session,user-controls,session-variables,Asp.net,Vb.net,Session,User Controls,Session Variables,我有一个使用UpdatePanel的用户控件。控件本质上是一个带有按钮的表。当用户单击按钮时,将打开一个模式弹出窗口,允许用户选择一些值。表的数据(使用中继器作为其数据源)存储在部分回发之间的会话变量中(当UpdatePanel触发时),作为对象列表。如果我只有一个控件,那么一切都可以正常工作,但是如果我在同一个页面中多次使用此控件,会话变量中的对象列表会合并,并且不会对每个控件进行分离。我想这可能是因为会话变量名不是唯一的,所以无论我在哪里调用或使用该变量,我都会这样做: Dim sessio

我有一个使用
UpdatePanel
的用户控件。控件本质上是一个带有
按钮的表。当用户单击
按钮时,将打开一个模式弹出窗口,允许用户选择一些值。表的数据(使用
中继器作为其
数据源
)存储在部分回发之间的会话变量中(当
UpdatePanel
触发时),作为对象列表。如果我只有一个控件,那么一切都可以正常工作,但是如果我在同一个页面中多次使用此控件,会话变量中的对象列表会合并,并且不会对每个控件进行分离。我想这可能是因为会话变量名不是唯一的,所以无论我在哪里调用或使用该变量,我都会这样做:

Dim sessionName as string = Me.UniqueID & "_" & "userNotificationDS"
Session(sessionName) = myListOfObjects
Me.notifier1.bindData(notificationList)
但这并没有改变结果。有人知道我可能做错了什么吗?如果您认为完整的代码会有帮助,请告诉我

控制服务器代码:

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

在本例中,当用户从notifier1(delete_click事件)中删除某个对象时,该对象将从列表中删除,并添加回会话。如果有任何原因导致notifier2的更新面板触发,它将显示与notifier1相同的确切数据

我的直觉是,您正在会话中存储您的
myListOfObjects
,但在某个位置重用该对象并对其进行修改,然后使用不同的键再次将其存储在
会话中。它可能仍然是为两个
会话
键存储的相同对象


您可以通过使用两个不同的键在
会话中存储对象来执行简单的测试。然后使用第一个键将其拉出并修改该对象,不要将其重新分配回
会话
(无论如何都不需要)。现在从第二个关键点拉出另一个对象并查看它。它将匹配修改,因为对象是在
会话中存储在两个不同键下的同一个对象

如果Kelsey的直觉正确,您可以将MyListFobjects的每个实例存储在
字典(字符串的,MyListFobjectStype的)
中,并使用.UniqueID作为键(字符串的部分).

谢谢您的回复。虽然我确实修改了MyListFobjects列表中的初始对象列表(添加/编辑/删除/重新排序),但我总是使用上面发布的会话ID保存它,使用用户控件uniqueId。@jason,但我要说的是,两个唯一键都存储了对同一对象的引用。因此,您可以执行
Session[“A”]
Session[“B”]
,但它们都存储相同的引用,因此当您认为您正在处理
A
版本时,实际上您也在使用
B
。同样,这只是基于您如何描述问题的一种预感。您能否发布如何存储每个
会话
对象(显示您正在使用
新的
对象)以及如何注意到它们混合在一起。是的,我将在上面添加相关代码。我知道你在说什么,但我在每一个事件上都放上了断点,而且从来没有看到你描述的发生了什么。我知道发生这种情况是因为这样的场景:正如我所说的,控件是一个带有datarepeater的表。当用户单击按钮时,将显示一个选择值的对话框。这些值被添加(或删除)到中继器。当我在一个控件中进行更改时,其更新面板将触发并更新表。如果一个事件导致另一个表刷新,同样的更改将出现在那里。我还为所有这些事件添加了断点。当代码运行时(即用户删除记录),一切正常。我可以看到会话密钥和数据集以及它们是否匹配。这里没有混乱。只有当其他控件更新面板时才会触发。然后,在OnLoad事件中,我可以看到两个会话密钥获得相同的数据集