为什么会话数据项会更改其值?

时间:2016-12-06 13:16:02

标签: asp.net-mvc vb.net session

我正在asp.net mvc中开发一个网页。在一个动作中,控制器重新获取一个对象,它将对象的值存储在会话的一个项目中,然后将其作为参数传递给一个方法,该方法将该对象存储在另一个变量中,并在一些验证后修改该变量的值。我遇到的问题是,一旦方法改变了变量的值,由于任何原因,我不知道会话项中的值也会发生变化。

有谁知道为什么会话项目中的数据会发生变化,我怎么能不改变?

这里是动作和方法的代码:

<AllowAnonymous()>
Function ListadoArticulos(ByVal filtroArticulos As Capturas.FiltrosArticulosAnuncios, Optional iPage As Integer = 1) As ActionResult
    Dim filtroOriginal As Capturas.FiltrosArticulosAnuncios = CType(Me.Session.Item("filtroArtListaOriginal"), Capturas.FiltrosArticulosAnuncios)
    Dim filtroLista As Capturas.FiltrosArticulosAnuncios = CType(Me.Session.Item("filtroArtLista"), Capturas.FiltrosArticulosAnuncios)
    ViewBag.iIdTipoBien = 5
    ViewBag.iValue = New SelectList(orderListItems, "iValue", "sDescripcionValue", filtroArticulosNew.iOrdenLista)
    ViewBag.filtrosAplicados = Capturas.FiltrosArticulosAnuncios.DepurarFiltroAnuncioArticulo(filtroOriginal, filtroLista)
    Return View(listaAnuncios.ToPagedList(iPage, 27))
End Function


Public Shared Function DepurarFiltroAnuncioArticulo(ByVal filtroOriginal As      Capturas.FiltrosArticulosAnuncios, ByVal filtroAplicado As Capturas.FiltrosArticulosAnuncios)
        Dim filtroResultado As New Capturas.FiltrosArticulosAnuncios
        filtroResultado = filtroAplicado

        'Evalúa el valor de cada propiedad del filtro y actualiza la propiedad en el caché
        If filtroOriginal.iIdPais > 0 Then
            filtroResultado.iIdPais = Nothing
            filtroResultado.Pais = Nothing
        End If
        If filtroOriginal.iIdCategoria > 0 Then
            filtroResultado.iIdCategoria = Nothing
            filtroResultado.Categoria = Nothing
        End If
        If filtroOriginal.iIdTipoOperacion > 0 Then
            filtroResultado.iIdTipoOperacion = Nothing
            filtroResultado.TipoOperacion = Nothing
        End If
        If filtroOriginal.iIdUnidadPolitica > 0 Then
            filtroResultado.iIdUnidadPolitica = Nothing
            filtroResultado.UnidadPolitica = Nothing
        End If
        If filtroOriginal.lPrecioDesde > 0 Then
            filtroResultado.lPrecioDesde = Nothing
        End If
        If Not IsNothing(filtroOriginal.sDescripcionArticulo) Then
            filtroResultado.sDescripcionArticulo = Nothing
        End If
        Return (filtroResultado)
    End Function
End Class

1 个答案:

答案 0 :(得分:1)

那是因为会话持久性如何工作和对象引用工作。如果将对象放入会话包装器,它不会立即保留,而是在asp.net管道的末尾。只有在将对象放入会话包装器时才传递对象的引用。当它开始序列化会话时,对象已经改变了。我建议将一个克隆对象放到会话包装器中。实施IClonable界面或使用Object.MemberwiseClone方法