2

我正在尝试将会话状态存储在母版页中以跟踪以前的 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 时,会话仍然显示 url 是“login. aspx”而不是“main.aspx”

我没有在代码中的其他位置设置此会话状态,它似乎只是自行恢复到以前的值。

无论我单击多少链接以及设置了多少次会话,会话变量都不会更改为“login.aspx”之外的任何其他内容

帮助!

编辑:另一个奇怪的细节,当我将 AddHandler 行从母版页移动到非母版页时,会话状态被正确保存。但是,如果我尝试将 Addhandler 代码移动到母版页 MainContent.Load 函数中,它仍然不起作用

4

2 回答 2

1

SiteMapResolve 是一个静态事件。

这意味着它无权访问会话对象。如果您在HandleSiteNode代码中放置断点并检查 Session.SessionId 属性,您会注意到这一点。

MSDN 上有关该事件的示例都针对 global.asax 文件,这意味着该处理程序实际上是针对站点的单一用途。请注意,我链接到的 MSDN 示例有点笨拙,因为它在每次页面加载时附加一个新事件,这会占用内存。该事件应该只附加一次。

单击此处以获取有关解决这些问题的潜在方法的更多信息。

于 2013-01-15T18:50:58.393 回答
1

显然,我的网络项目至少有 2 个不同的会话状态。

我可以通过使用访问包含我想要的值的会话状态

e.Context.Session("theprevpage")

这似乎有点像黑客,但它对我有用。

于 2013-01-16T15:40:46.540 回答