【问题标题】:.NET Master Page Session state variable not saving.NET 母版页会话状态变量未保存
【发布时间】:2013-01-15 17:59:31
【问题描述】:

我正在尝试将会话状态存储在母版页中以跟踪以前的 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”之外的任何其他内容

救命!

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

【问题讨论】:

  • Request.UrlReferrer 不可靠。
  • @Win 是的,我意识到了,但我的问题仍然存在

标签: asp.net session master-pages session-variables session-state


【解决方案1】:

SiteMapResolve 是一个静态事件。

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

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

Click here 了解有关解决问题的潜在方法的更多信息。

【讨论】:

  • 当我检查 Session.SessionID 时,我得到了“xx2n0ikrll4kyr3lolsrbh5s”。我还编辑了我的主要帖子,为这个问题添加了 /another/twist。感谢您迄今为止的帮助。
【解决方案2】:

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

我可以使用

访问包含我想要的值的会话状态
e.Context.Session("theprevpage")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多