您使用什么构造/模式来访问状态?

时间:2010-02-04 19:10:07

标签: c# asp.net vb.net webforms

假设您正在构建一些简单的东西,例如用于处理名为Customer的实体的数据输入/ CRUD表单。也许您通过会话状态传递CustomerID。

我倾向于以特定的方式编写许多相当的样板管道代码来处理Session变量。目标略有不同,但往往是:

  • 避免使用管道代码混乱页面的主流
  • 智能处理后退按钮
  • 从Session中删除变量并将其保存到ViewState ASAP
  • 对于状态未通过或丢失的失败情况进行防御性编码

您是否有处理这种情况的最佳做法?你的堆栈中是否每次都能完美地处理这个类?你只是直接调用Session变量吗?在这种情况下,你是否使用加密的QueryString并避免使用Session变量,以使后退按钮更好用?

最近我一直在使用带有Session变量的Properties。这是一个简单的例子,我只是把它放在一起,但请记住,这个例子不会对后退按钮非常宽容:

Private ReadOnly Property CustomerID() As Integer
    Get
        If Me.ViewState(Constants.CustomerID) Is Nothing Then
            If Me.Session(Constants.CustomerID) Is Nothing Then
                Throw New ApplicationException("CustomerID was not persisted.")
            Else
                Me.ViewState(Constants.CustomerID) = Me.Session(Constants.CustomerID)
                Me.Session.Remove(Constants.CustomerID)
            End If
        End If

        Return Me.ViewState(Constants.CustomerID)
    End Get
End Property

那么,您的商店如何处理这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

我参与过的团队没有在会话中传递这种工作流信息,主要是因为它对网络农场/花园造成了困难。我们认为会话是一个容器,用于从用户第一次访问站点到离开的那一刻起最相关(如果不是全部)的信息。即便如此,如果检索/构建信息非常昂贵,我只会使用会话,并且只有当我知道负载均衡器会将用户粘到服务器场中的特定服务器或者我们有一个合适的服务器时才会使用会话。进程会话提供程序到位。

相反,我会通过查询字符串,隐藏输入字段或ViewState(如果启用)传递此类信息,并在发送无效值时提供友好的错误处理。如果历史管理很重要,我会利用ASP.NET AJAX history management