【问题标题】:Putting an object in session via a property in ASP.NET通过 ASP.NET 中的属性将对象置于会话中
【发布时间】:2009-04-22 00:29:36
【问题描述】:

这似乎是个坏主意,但我不知道为什么:

我有一个类 cXYZ,它具有属性 A、B 和 C。它还有一个方法 'sGetData' 从数据库中加载这三个属性,以及一个方法 'sSaveData' 将其保存回来。

class cXYZ

  public property A as string...
  public property B as string...
  public property B as string..

  public sub sGetData()...
  public sub sSaveData()...

end class

网络表单具有以下属性:

private property xyz() as cXYZ
get
    return session("myXYZ")
end get
set (value as cXYZ)
    session("myXYZ")=value
end set
end property

还有以下事件:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

if not ispostback() then
    xyz=new cXYZ()
end if

end sub

Protected Sub ButtonLoad_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonLoad.Click

   //Can now reference the class
  txtA.text=xyz.A
  txtB.text=xyz.B
  txtC.text=xyz.C

end sub


 Protected Sub ButtonSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonSave.Click

  //Can now reference the class
  xyz.A=txtA.text
  xyz.B=txtA.text
  xyz.C=txtC.text

  xyz.sSaveData()

end sub

我可以看到对每个属性引用进行序列化/反序列化的一些开销 - 这样做可能值得:

 Protected Sub ButtonSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonSave.Click

  dim localxyz as cXYZ=xyz

  localxyz .A=txtA.text
  localxyz .B=txtA.text
  localxyz .C=txtC.text

  xyz=localxyz

end sub

除此之外,对为什么这是好还是坏的看法?该类并不大,它保持表单状态。网络表单很烂,等等不是很有用..

【问题讨论】:

    标签: asp.net session serialization


    【解决方案1】:

    我会改进一点:

     private _xyz as cXYZ = nothing 
    
     private property xyz() as cXYZ 
       get
          if _xyz is nothing then _xyz = TryCast(session("myXYZ"), cXYZ)
          return _xyz
       end get 
       set (value as cXYZ)
          _xyz = value
          session("myXYZ")=_xyz 
       end set
    end property
    

    【讨论】:

    • 如果局部变量什么都没有,为什么还要使用 trycast 选项?我能想到的唯一原因是如果它没有在事件模型中被实例化,那么它会自动获取对象的会话副本。 (这可能是有效的——比如说在从第一个获取数据的第二个网络表单上)
    • 您可以使用 DirectCast 来提高性能,但如果变量没有,DirectCast 或 TryCast 将成功转换,除非数据类型不是引用类型。
    【解决方案2】:

    我觉得还可以。我会额外保留一个变量来存储对象以提高性能。

    类似这样的:

    private _xyz as cXYZ = nothing 
    private property xyz() as cXYZ 
       get
          if not _xyz is nothing then 
             return _xyz
          else
             return session("myXYZ")
          end if 
       end get 
       set (value as cXYZ)
          _xyz = value
          session("myXYZ")=value 
       end set
    end property
    

    【讨论】:

      【解决方案3】:

      只要你的对象是可序列化的,你就可以了。

      只是不要在您的会话中持有任何非托管对象引用 - 否则一旦您从“处理中”会话状态转移到网络场,您就会遇到麻烦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-07
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2012-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多