2

我試圖將會話狀態存儲在母版頁中以跟蹤以前的URL。下面是我在做什麼.NET主頁面會話狀態變量不保存

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函數,它仍然不起作用

+0

Request.UrlReferrer不可靠。 – Win

+0

@Win是的,我意識到這一點,但我的問題仍然存在 –

回答

1

顯然,我的web項目至少有2個不同的會話狀態。

我可以用

e.Context.Session("theprevpage") 

這似乎是一個黑客位的訪問包含我想要的值會話狀態,但它爲我工作。

1

SiteMapResolve是一個靜態事件。

這意味着它無權訪問會話對象。如果您在HandleSiteNode代碼中放置斷點並檢查Session.SessionId屬性,您會注意到這一點。

關於事件的examples on MSDN所有目標都是global.asax文件,這意味着處理程序確實適合單個站點的使用。請注意,我鏈接到的MSDN示例有點令人頭疼,因爲它會在每次頁面加載時附加一個新事件,這會佔用內存。該事件應該只附加一次。

Click here瞭解更多有關解決問題的潛在方法的信息。

+0

當我檢查Session.SessionID,我得到「xx2n0ikrll4kyr3lolsrbh5s」回來。我還編輯了我的主帖,並在這個問題上添加了另一個/另一個/扭曲。感謝您一直以來的幫助。 –