通过回发但特定于页面用户的变量的持久性

Posted

技术标签:

【中文标题】通过回发但特定于页面用户的变量的持久性【英文标题】:Persistence of a variable through post backs but specific to the user of the page 【发布时间】:2012-07-11 13:01:58 【问题描述】:

我正在开发一个带有 .aspx 页面和 VB.Net 代码的网站。在一个页面上,我需要一个公共共享变量,例如

Public Shared comments As String() = New String(2) "", "", ""

因为我需要通过页面的回帖来持久化“cmets”的值。至少我认为公开共享是保持持久性的唯一方法,除非你们告诉我我错了。

但另一方面,我不希望可能使用同一页面的其他用户与其他用户的“cmets”数据发生冲突。我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

这取决于您需要的持久性水平。

如果您只需要 cmets 在页面上驻留直到用户离开它,请使用您页面的 ViewState:

Public Property Comments As String()
    Get
        If Me.ViewState("Comments") Is Nothing Then
            Me.ViewState("Comments") = New String(2) "", "", ""
        End If
        Return Me.ViewState("Comments")
    End Get
    Set(value As String())
        Me.ViewState("Comments") = value
    End Set
End Property

如果您希望页面在导航离开和重新登陆页面(即初始加载而不是回发)之间保持页面的值,请使用您的会话状态包:

Public Property Comments As String()
    Get
        If Me.Session("MyPage_Comments") Is Nothing Then
            Me.Session("MyPage_Comments") = New String(2) "", "", ""
        End If
        Return Me.Session("MyPage_Comments")
    End Get
    Set(value As String())
        Me.Session("MyPage_Comments") = value
    End Set
End Property

如果您希望即使在会话过期并且用户稍后返回后也能保持这种状态,您需要写入将用户链接到他们的 cmets(例如数据库)的后备存储,或者 - 并且我这样说的热情要少得多——写出类似 XML 文件的东西,然后在如下语句中加载初始页面加载时的值:

 Public Sub PageLoad(sender As Object, e As EventArgs) Handles Me.Load
     If Not Me.IsPostBack
         ' Read the value from the backing store
     End If
 End Sub

但是,当使用后备存储时,我通常建议使用其中一个数据源控件以及诸如 ListView 或 GridView 之类的数据绑定控件来显示信息。

【讨论】:

以上是关于通过回发但特定于页面用户的变量的持久性的主要内容,如果未能解决你的问题,请参考以下文章

通过 AJAX 调用创建后 Symfony 2 会话不持久

回发和回调之间的区别

如何刷新页面并保持元素不刷新(持久),直到用户单击提交?

没有getter的DDD对象持久性

xss攻击

LDAP 会话持久性