【发布时间】:2019-08-30 23:35:14
【问题描述】:
我有 9 页,每页有 10 个字段。我可以使用单个会话变量来存储 9 页的所有字段(文本框、下拉列表、单选按钮)值吗?如果是这样,你能给我一个小例子以便继续。我有点卡住了。
【问题讨论】:
-
在会话中添加一个 [serializable] 类
标签: asp.net vb.net session-variables session-state
我有 9 页,每页有 10 个字段。我可以使用单个会话变量来存储 9 页的所有字段(文本框、下拉列表、单选按钮)值吗?如果是这样,你能给我一个小例子以便继续。我有点卡住了。
【问题讨论】:
标签: asp.net vb.net session-variables session-state
可以吗?是的。你应该?很可能不会 - 虽然我不能肯定地说不了解您打算解决什么问题。
使用一个示例解决方案进行更新
好的,我假设您要存储控件中的值,而不是控件本身。如果是这样,最简单的解决方案是使用一些有意义的标记来分隔它们。喜欢:
Session("MyControlValueList") = "name='txt1',value='hello'|name='txt2', value'world'"
要检索,您可以将它们拆分为字符串数组:
myArray = Session("MyControlValueList").Split("|")
然后遍历找到你想要的控件/值。
严格来说,这是一个的答案。我仍然质疑这是否是您特定场景的最佳答案。很遗憾,在您提供更多信息之前,我无法判断那。
【讨论】:
创建一个包含您要保存的所有字段的自定义类,然后填充该实例并将该实例保存为会话变量。
我有一些类似但不完全相同的东西 - 我正在为订单保存各种送货地址字段,并且我允许管理员更新订单,包括送货信息或订单行项目。由于该信息保存在单独的表中,因此我将运输信息存储在会话变量中,然后将其与点击“更新”按钮时表单上的内容进行比较。如果没有任何变化,我会跳过 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
考虑到您试图以这种方式保留的字段数量,这可能不切实际或不可取,但我不是来判断的,所以这是一种可能性。我曾在其他项目中使用过您创建一个表并将该表保存为会话变量的项目,因此如果您将该对象保存为会话变量,则您放入对象中的任何结构都会保留。
【讨论】: