我正在尝试将 session 状态存储在母版页中以跟踪以前的 URL。这就是我正在做的事情
Public Property PreviousPage() As String
Get
Return Session("theprevpage")
End Get
Set(value As String)
Session("theprevpage") = value
End Set
End Property
Private Function HandleSiteNode(ByVal sender As Object, ByVal e As SiteMapResolveEventArgs) As SiteMapNode
Dim currNode As SiteMapNode = SiteMap.CurrentNode.Clone(True)
Dim tempNode As SiteMapNode = currNode
Dim strPrev As String = PreviousPage
' Append parent pages query string back onto the parent's node URL
If Not tempNode.ParentNode Is Nothing Then
If strPrev.Contains("?") Then
tempNode.ParentNode.Url = tempNode.ParentNode.Url + "?" + strPrev.Split("?")(1)
End If
End If
Return currNode
End Function
并在母版页加载函数
If Not IsPostBack Then
AddHandler SiteMap.SiteMapResolve, AddressOf HandleSiteNode
PreviousPage = Request.UrlReferrer.ToString()
End If
现在,事情变得奇怪了。
第一页是登录页面,不会调用主加载。登录后,转到 main.aspx 页面,它成功地将“login.aspx”页面保存在 session 状态中。
现在,当我登录后第二次导航时, session 状态已成功设置,但是当它进入 session 设置成功后调用的 HandleSiteNode 时, session 仍然显示 url “login.aspx”而不是“main.aspx”
我没有在代码中的其他位置设置此 session 状态,它似乎只是自行恢复到之前的值。
无论我点击多少个链接以及设置多少次 session ,Session 变量都不会更改为除“login.aspx”之外的任何其他内容
救命!
编辑:另一个奇怪的细节,当我将 AddHandler 行从母版页移动到非母版页时, session 状态被正确保存。但是,如果我尝试将 Addhandler 代码移至母版页 MainContent.Load 函数中,它仍然不起作用
最佳答案
SiteMapResolve 是静态事件。
这意味着它无权访问 session 对象。如果您在 HandleSiteNode
代码中放置断点并检查 Session.SessionId 属性,您会注意到这一点。
examples on MSDN关于该事件的所有目标都是 global.asax 文件,这意味着处理程序实际上适合该站点的单次使用。请注意,我链接到的 MSDN 示例有点夸张,它会在每次页面加载时附加一个新事件,这会消耗内存。该事件只能附加一次。
Click here有关解决这些问题的潜在方法的更多信息。
关于asp.net - .NET 母版页 session 状态变量未保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14343869/