页面过渡类 - ASP 到 ASP.NET 迁移






3.75/5 (3投票s)
2005年7月4日
4分钟阅读

32664

311
允许开发人员在 ASP.NET 和 ASP 页面之间传递类似会话的信息。
引言
该类的目的是帮助迁移大型 ASP 项目到 ASP.NET。
主要目的是允许开发人员在 ASP.NET 和 ASP 页面之间传递类似会话的信息。我将此类与我包含在源代码中的另外几个类结合使用。其中一个是一个可持久化的集合,它实际上就是我在 viewstate 中保存的一个集合。
背景
首先,让我解释一下我创建这个类的原因。最近,我接到一个任务,需要将一个相当大的 ASP 应用程序升级到 ASP.NET 应用程序,但有一些限制(总是有的)。
- 更新必须分阶段进行。
- 所有页面都通过(JavaScript 客户端帖子)将特定值传递给所有其他页面。
- 无法使用会话,因为有时可能会使用多个浏览器窗口,导致会话变量被覆盖。
详细来说,每个链接、按钮等都调用了一个客户端帖子函数,该函数将隐藏表单字段值发布到当前页面或其他页面(不是我设计的!)。分阶段开发方法使得我无法重写整个站点为 ASP.NET,而是必须根据需求一次完成几个页面。所以我坐下来思考,提出了这个过渡类。
设计
这个类是专门为这个特定的 Web 应用程序制作的,因此您可能需要也可能不需要使用我随它提供的某些内容。例如,我没有直接使用 viewstate,而是创建了一个我称为隐藏列表的类。基本上,这个类就是一个启用 viewstate 的集合,所以它会在回发中保持不变。我提到这一点是因为页面过渡类的一个重载的 add 方法允许我一次性传递整个隐藏列表,从而一次性添加我需要传递的所有内容。
Dim objTrans as New PageTransition("somepage.asp")
objTrans.Add(myHiddenList)
objTrans.Go
我会简要介绍一下隐藏列表,但它会包含在源代码中供您检查。
代码 - .NET 端
Private _objPassedValues As Hashtable
Private Sub SaveSessionState()
Dim strSessionID As String = HttpContext.Current.Session.SessionID.ToUpper
Dim intRnd As Integer = (New Random).Next
strSessionID += intRnd.ToString
HttpContext.Current.Session.Clear()
For Each strKey As String In _objPassedValues.Keys
Dim objConn As New SqlConnection(GenerateSqlConnString)
Dim objCmd As New SqlCommand("spSetSessionState", objConn)
objCmd.CommandType = CommandType.StoredProcedure
objCmd.Parameters.Add(New SqlParameter("@SessionID", strSessionID))
objCmd.Parameters.Add(New SqlParameter("@Variable", strKey))
If TypeOf _objPassedValues(strKey) Is Boolean Then
objCmd.Parameters.Add(New SqlParameter("@Value", _
_objPassedValues(strKey).ToString))
Else
objCmd.Parameters.Add(New SqlParameter("@Value", _
_objPassedValues(strKey)))
End If
objConn.Open()
objCmd.ExecuteNonQuery()
objConn.Close()
Next
If _strDestination.IndexOf("?") <> -1 Then
_strDestination += "&TranSID=" & strSessionID
Else
_strDestination += "?TranSID=" & strSessionID
End If
End Sub
正如您所见,我的主要想法来自与 SQL Server 的无 Cookie 会话。(存储过程也包含在源代码中。)
基本上,我在这里这样做:
- 获取当前的会话 ID。
- 获取一个随机数并将其附加到会话 ID。
- 立即清除会话以强制生成新的会话 ID。
这样可以确保此浏览器 ID 唯一。然后,它所做的就是简单地将目标附加到带有查询字符串值的目标。
该类**直到**执行 PageTransition.Go
时才执行 Response.Redirect
。原因是因为有一个名为 SimulateGo
的方法,它不会实际过渡,而是执行所有其他操作并返回它**本应该**去的地方。您可能认为我疯了,但我确实有理由。
这是 Go
方法的样子:
Public Sub Go()
Dim objSession As SessionState.HttpSessionState = HttpContext.Current.Session
For Each strVariable As String In objSession.Keys
Try
_objPassedValues.Add(strVariable, objSession.Item(strVariable))
Catch
End Try
Next
SaveSessionState()
HttpContext.Current.Response.Redirect(_strDestination)
End Sub
正如您所见,它相当简单。它在最后一刻从会话中获取所有值(因为它们在 SaveSessionState
中被清除了),然后将会话保存到数据库。最后进行重定向。
代码 - ASP 端
这段代码相当简单。在我们的例子中,每个 ASP 页面上都有一个字典对象,其中包含所有表单值(不要问我为什么,不是我设计的!)。所以我只是直接将任何过渡的信息放入其中,但您可以根据自己的情况处理。
Sub subHandleDotNetTransition
Dim strTransitionID, objTransitionRS, strReferer
strReferer=Request.ServerVariables("HTTP_REFERER")
if instr(strReferer,"?") > 0 then
strReferer= left(strReferer, instr(strReferer,"?")-1)
end if
If UCASE(Right(strReferer, 5)) = ".ASPX" Then
strTransitionID = Request.QueryString("TransID")
If strTransitionID <> "" Then
'Execute your DB code to call spGetSessionState and retreive
'the session information by passing it the SessionID
End If
End If
End Sub
在我的例子中,这段代码在一个包含在网站每个页面中的头文件中执行。
代码 - 隐藏列表
我仍然认为隐藏列表是一个很棒的小工具。总之,这是它的基本知识。
它只是一个哈希表,我将其变成了一个控件,并启用了 viewstate。
这意味着什么?这意味着我可以存储任何可序列化的对象,并且它会一直保存到我离开页面为止。(不再需要隐藏变量!)我包含了它的源代码,但我不会费心发布它的代码,它真的非常简单。
结论
这对我来说无疑是一次学习经历,但总的来说,它工作得相当好,所以我很高兴。我希望这能像帮助我一样帮助到其他人。这是我的第一篇文章,所以请友好对待。另外,我在这里很活跃,所以随时提问,我会很快回复您。
历史
- v1.0 - 2005.06.29 - 创建。