【问题标题】:Can i use a single session variable to store all the field values我可以使用单个会话变量来存储所有字段值吗
【发布时间】:2019-08-30 23:35:14
【问题描述】:

我有 9 页,每页有 10 个字段。我可以使用单个会话变量来存储 9 页的所有字段(文本框、下拉列表、单选按钮)值吗?如果是这样,你能给我一个小例子以便继续。我有点卡住了。

【问题讨论】:

  • 在会话中添加一个 [serializable] 类

标签: asp.net vb.net session-variables session-state


【解决方案1】:

可以吗?是的。你应该?很可能不会 - 虽然我不能肯定地说不了解您打算解决什么问题。

使用一个示例解决方案进行更新

好的,我假设您要存储控件中的,而不是控件本身。如果是这样,最简单的解决方案是使用一些有意义的标记来分隔它们。喜欢:

Session("MyControlValueList") = "name='txt1',value='hello'|name='txt2', value'world'"

要检索,您可以将它们拆分为字符串数组:

myArray = Session("MyControlValueList").Split("|")

然后遍历找到你想要的控件/值。

严格来说,这是一个的答案。我仍然质疑这是否是您特定场景的最佳答案。很遗憾,在您提供更多信息之前,我无法判断

【讨论】:

  • 我试图找出如何使用单个会话变量来存储页面的所有这些字段值
  • @user3341446 是的,我们明白了。这就是你的问题是的。但是你需要充实它,更好地说出你想要完成的事情。顺便说一句,Session 本身是一个“单一变量”,可以存储“所有字段值”。所以你真的需要弄清楚你的目标是什么。
  • 我想为所有控件创建属性(获取和设置),然后将其存储在单个会话中。
【解决方案2】:

创建一个包含您要保存的所有字段的自定义类,然后填充该实例并将该实例保存为会话变量。

我有一些类似但不完全相同的东西 - 我正在为订单保存各种送货地址字段,并且我允许管理员更新订单,包括送货信息或订单行项目。由于该信息保存在单独的表中,因此我将运输信息存储在会话变量中,然后将其与点击“更新”按钮时表单上的内容进行比较。如果没有任何变化,我会跳过 SQL Server 数据库上的更新例程。

对我来说,最简单的方法是创建一个“OrderInfo”类。我将运输信息保存到此类,然后将该类保存到会话变量中。这是显示类的代码 -

   Public Class OrderInfo
    Private v_shipname As String
    Private v_add1 As String
    Private v_add2 As String
    Private v_city As String
    Private v_state As String
    Private v_zipcd As String
    Private v_dateneeded As Date
    Private v_billingmeth As Integer

    Public Property ShipName() As String
        Get
            Return v_shipname
        End Get
        Set(value As String)
            v_shipname = value
        End Set
    End Property

    Public Property Add1() As String
        Get
            Return v_add1
        End Get
        Set(value As String)
            v_add1 = value
        End Set
    End Property

    Public Property Add2() As String
        Get
            Return v_add2
        End Get
        Set(value As String)
            v_add2 = value
        End Set
    End Property

    Public Property City() As String
        Get
            Return v_city
        End Get
        Set(value As String)
            v_city = value
        End Set
    End Property

    Public Property State() As String
        Get
            Return v_state
        End Get
        Set(value As String)
            v_state = value
        End Set
    End Property

    Public Property ZipCd() As String
        Get
            Return v_zipcd
        End Get
        Set(value As String)
            v_zipcd = value
        End Set
    End Property

    Public Property DateNeeded() As Date
        Get
            Return v_dateneeded
        End Get
        Set(value As Date)
            v_dateneeded = value
        End Set
    End Property

    Public Property BillingMeth() As Integer
        Get
            Return v_billingmeth
        End Get
        Set(value As Integer)
            v_billingmeth = value
        End Set
    End Property
End Class

这是我测试概念时的代码,看看我是否可以将自定义类存储在会话变量中。该例程获取订单记录,填充自定义类实例中的字段以及 Web 表单中的字段。我将该实例保存到会话变量中,然后初始化该自定义类的另一个新实例,将会话变量加载到其中。然后我显示“检索”自定义类中的字段值,标签上显示的内容与应有的内容相匹配 -

Protected Sub LoadOrderInfo(ByVal ordID As Integer)
        Dim connSQL As New SqlConnection
        connSQL.ConnectionString = ConfigurationManager.ConnectionStrings("sqlConnectionString").ToString
        Dim strProcName As String = "uspGetOrderInfoGeneral"
        Dim cmd As New SqlCommand(strProcName, connSQL)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("OrderID", ordID)

        If connSQL.State <> ConnectionState.Open Then
            cmd.Connection.Open()
        End If

        Dim drOrderInfo As SqlDataReader
        drOrderInfo = cmd.ExecuteReader

        If drOrderInfo.Read Then
            Dim orgOrder As New OrderInfo
            orgOrder.ShipName = drOrderInfo("shipName")
            orgOrder.Add1 = drOrderInfo("ShipAdd1")
            orgOrder.Add2 = drOrderInfo("ShipAdd2")
            orgOrder.City = drOrderInfo("ShipCity")
            orgOrder.State = drOrderInfo("ShipState")
            orgOrder.ZipCd = drOrderInfo("ShipZip")
            orgOrder.DateNeeded = drOrderInfo("DateNeeded")
            orgOrder.BillingMeth = drOrderInfo("BillingMethodID")

            If Session.Item("orgOrder") Is Nothing Then
                Session.Add("orgOrder", orgOrder)
            Else
                Session.Item("orgOrder") = orgOrder
            End If

            ' I could just as easily populate the form from the class instance here

            txtShipName.Text = drOrderInfo("shipName")
            txtAdd1.Text = drOrderInfo("ShipAdd1")
            txtAdd2.Text = drOrderInfo("ShipAdd2")
            txtCity.Text = drOrderInfo("ShipCity")
            txtState.Text = drOrderInfo("ShipState")
            txtZipCd.Text = drOrderInfo("ShipZip")
            selDate.Value = drOrderInfo("DateNeeded")
            ddlBillMeth.SelectedValue = drOrderInfo("BillingMethodID")
        End If

        cmd.Connection.Close()

        Dim retOrder As New OrderInfo
        retOrder = Session.Item("orgOrder")

        lblWelcomeMssg.Text = retOrder.ShipName & ", " & retOrder.Add1 & ", " & retOrder.City & ", " & retOrder.DateNeeded.ToShortDateString & ", " & retOrder.BillingMeth.ToString
    End Sub

考虑到您试图以这种方式保留的字段数量,这可能不切实际或不可取,但我不是来判断的,所以这是一种可能性。我曾在其他项目中使用过您创建一个表并将该表保存为会话变量的项目,因此如果您将该对象保存为会话变量,则您放入对象中的任何结构都会保留。

【讨论】: