【问题标题】:What constructs/patterns do you use for accessing state?您使用什么构造/模式来访问状态?
【发布时间】:2010-02-04 19:10:07
【问题描述】:

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

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

  • 避免使用管道代码使页面的主要流程混乱
  • 智能处理后退按钮
  • 从 Session 中移除变量并尽快将其持久化到 ViewState
  • 针对状态未通过或丢失的故障情况进行防御性编码

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

最近我一直在使用带有会话变量的属性。这是我刚刚拼凑的一个简单示例,但请记住,此示例不会非常容忍返回按钮:

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

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

【问题讨论】:

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


    【解决方案1】:

    我工作过的团队不会在会话中传递这种工作流信息,主要是因为它给网络农场/花园带来了困难。我们将会话视为信息的容器,从用户第一次访问网站到他们离开的那一刻,这些信息在大多数(如果不是全部)时间都是相关的。即使那样,我也只会在检索/构建该信息非常昂贵的情况下使用会话,并且只有当我知道负载平衡器会将用户固定到场中的特定服务器或者我们有合适的外部 -处理会话提供程序。

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

    【讨论】:

    • 只是好奇您通过隐藏输入字段或视图状态传递数据是什么意思?我猜你说的是跨页回发?我还没用过。
    • 在这两种情况下,我都在谈论 POST 到另一个 URL。使用 ASP.NET WebForms,这可能是使用 ViewState 的跨页面回发。在 ASP.NET MVC 中,这可能只是一个简单的 HTML
      ,其 action 属性设置为另一个 URL,其中包含一个带有“type=hidden”的 元素。在 WebForms 中,如果您有一个多页面流,您还可以使用围绕智能用户控件的 Wizard 或 MultiView Web 控件,将回发保持在同一页面上,而无需将内容传递到其他页面。
    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2019-12-03
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多