代码之家  ›  专栏  ›  技术社区  ›  Brian MacKay

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

  •  1
  • Brian MacKay  · 技术社区  · 15 年前

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

    我倾向于编写大量关于以特定方式处理该会话变量的样板式管道代码。目标略有不同,但往往是:

    • 避免将页面的主要流与管道代码混淆。
    • 智能处理后退按钮
    • 从会话中移除变量,并尽快将其保持为VIEWSTATE
    • 为状态未通过或丢失的故障情况编写防御代码

    你有处理这种情况的最佳实践吗?您的堆栈中是否有每次都能完美处理这个问题的类?您只是直接调用会话变量吗?在这种情况下,是否使用加密的querystring并完全避免会话变量,以使后退按钮工作得更好?

    最近我一直在使用会话变量的属性。这里有一个简单的例子,我刚刚把它放在一起,尽管请记住,这个例子不能很好地容忍后退按钮:

    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 回复  |  直到 15 年前
        1
  •  1
  •   G-Wiz RameshVel    15 年前

    我工作过的团队在会话中不会传递这种工作流信息,主要是因为它对Web农场/花园造成了困难。我们将会话看作是一个信息容器,从用户第一次访问站点到他们离开站点的大部分时间(如果不是全部)都是相关的。即使在那时,我也只会在那些信息检索/构建非常昂贵的情况下使用会话,并且只有当我知道负载均衡器会将用户固定到服务器场中的特定服务器上,或者我们有一个合适的进程外会话提供程序时才使用会话。

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