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