我正在尝试将会话状态存储在母版页中以跟踪以前的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”页面保存在会话状态。
现在,当我在登录后第二次导航时,会话状态设置成功,但是当它进入在成功设置会话后调用的HandleSiteNode时,会话仍然说网址是“login.aspx”而不是“main.aspx”
否则代码中的其他位置我设置此会话状态,它似乎只是恢复到它以前的值。
无论我点击多少链接&会话设置的次数,Session变量将永远不会更改为“login.aspx”
之外的任何其他内容帮助!
编辑:另一个奇怪的细节,当我将AddHandler行从母版页移动到非母版页时,会话状态被正确保存。但是,如果我尝试将Addhandler代码移动到主页面MainContent.Load函数中,它仍然无法正常工作
答案 0 :(得分:1)
SiteMapResolve是一个静态事件。
这意味着它无权访问会话对象。如果在HandleSiteNode
代码中放置断点并检查Session.SessionId属性,则会注意到这一点。
关于事件的examples on MSDN都是针对global.asax文件的,这意味着处理程序真正适合单次使用该站点。请注意,我链接到的MSDN示例有点突出,因为它会在每个页面加载时附加一个新事件,这将占用内存。该活动应仅附加一次。
Click here了解有关解决问题的潜在方法的更多信息。
答案 1 :(得分:1)
显然,我的网络项目至少有两种不同的会话状态。
我可以使用
访问包含我想要的值的会话状态e.Context.Session("theprevpage")
这看起来有点像黑客,但它对我有用。