用ASP实现Web表单的数据保持(二)
青苹果工作室编译 2000-10-31 10:29:00
一个更加动态的方法
还有一个等待解决的问题是我们不知道每个特定的页面有多少需要存储的值。我们真的想要有一种一般的方法可以反复地使用,而不用总是为获取正确的数组维数而担心。最容易的方法就是使用动态数组。在VBScript中,我们可以用ReDim
关键字创建一个动态数组,以后再用相同的关键字调整它的大小。如果我们在调整大小时包含了Preserve 关键字,我们就可以保持存储的值。有一个限制就是只能在最后一维调整多维数组的大小。
我们例子中的页面(名为aspstate.asp )就使用了这个技术。首先声明一个能容纳255个控制名字和值的数组。注意第二列(最后一列)指数是与我们所发现的控制数不同的一个。我们还将计数器变量intIndex(当我们发现控制域时计算其个数)设置为0。
'create a dynamic two-dimensional
array
ReDim arrVals(1, 255)
intIndex = 0
现在我们在Request.Form集合中循环以填充数组。
'loop through the Request.Form collection
For Each varItem in Request.Form
If Request.Form(varItem).count >
1 Then
'this is itself a collection so
iterate each value
For intLoop = 1 to Request.Form(varItem).count
'store control name and value
in array
arrVals(0, intIndex) = varItem
& "(" & intLoop & ")"
arrVals(1, intIndex) = Request.Form(varItem)(intLoop)
intIndex = intIndex + 1
Next
Else
'this is a single control item
so just store in array
arrVals(0, intIndex) = varItem
arrVals(1, intIndex) = Request.Form(varItem)
intIndex = intIndex + 1
End If
Next
现在我们的数组中已经有了全部控制域名和它们的值,intIndex
包含着Request.Form 集合中所表现的控制域个数的记数值。我们可以调整数列的大小,这样一来它就只包含元素的记数值。由于数列从第0列开始,我们就用intIndex
- 1 作为新的列数。
'resize the array to the correct
size
ReDim Preserve arrVals(1, intIndex
- 1)
现在该考虑一下我们如何将数组放入Session 对象中。我们从Request.ServerVariables
集合中收集引用页面(装载这个页面的表单页面)的名字,去掉路径。然后在Session 对象中把它用做变量名:
'get the name for the session variable
using the script
'name of the form page which was
the referrer
strReferrer = Request.ServerVariables("HTTP_REFERER")
strReferrer = Mid(strReferrer,
InstrRev(strReferrer, "/") + 1)
'save the array in the Session
Session(strReferrer) = arrVals
结束时,我们只要在页面中显示存储在数组中的值来证明我们所做的工作:
Response.Write "< P >----
values received and stored ----< BR >"
'display the array contents
For intIndex = 0 To UBound(arrVals,
2)
Response.Write arrVals(0, intIndex)
& " = " _
& arrVals(1, intIndex)
& "< BR >"
Next
这里是用我们以前使用过的相同的值所得到的结果:
|