2011-10-26 75 views
2

對於我的申請,我通過Server.Transfer有一個頁面重定向到另一個頁面(在同一應用程序內)。我需要這樣做,因爲原始頁面有一個對象,我需要通過使用Page.PreviousPage屬性來訪問。失去Server.Transfer的局部變量

一旦我的「目的地」頁面已經被完全加載,我所做的源頁面的對象的本地深克隆突然從內存中釋放一次我執行回發?這是由設計 - 與Server.Transfer有關嗎?

一個例子...

Page1.aspx的:

Public Structure myCustomObject 
    Implements ICloneable 
    Dim someField as String = "default value" ' Default value 
    Public Function Clone() As Object Implements System.ICloneable.Clone 
     Dim temp as new myCustomObject 
     temp.someField = Me.someField 
     Return temp 
    End Function 
End Structure 

Dim obj As myCustomObject 
Public ReadOnly Property objProp as myCustomObject 
    Get 
     Return obj 
    End Get 
End Property 
objProp.someField = "changed value from source page" 

Server.Transfer("page2.aspx", True) 

Page2.aspx:

(onLoad) 
Dim newObj As myCustomObject 
newObj = Page.PreviousPage.objProp.Clone() 
Debug.Write(newObj.someField) ' Output: "changed value from source page" 

在這一點上,一切正常,因爲它應該。東西克隆正確,一切都很好。

(Let's say this is on a button click event) 
Debug.Write(newObj.someField) ' Output: "default value"<- This is NOT "changed value from source page" for some reason when it was working literally a few lines ago! 

這是我在這裏,我得到的問題。我的猜測是Server.Transfer在加載新頁面後會停止與源頁面的任何關聯。

是否有跨頁物體通過更好的辦法?

+0

如果你把一個按鈕和頁面上的服務器端點擊可以從點擊事件訪問對象?你能顯示一些代碼嗎? –

+0

我所說的可能有點不清楚,但我不知道有任何其他方式來表達它。 – danyim

+1

這對我來說味道不好。當然,您可以將原始對象存儲在其他容器中,並在重定向頁面的頁面加載中將其拉回。 – Graham

回答

2

只是傳遞一個變量在HttpContext,你將不得不處理你的施法,不知道什麼Page.PreviousPage是:

當前頁:

HttpContext CurrContext = HttpContext.Current; 
CurrContext.Items.Add("PreviousPage", Page.PreviousPage); 

轉移到頁面:

HttpContext CurrContext = HttpContext.Current; 
var previousPage = CurrContext.Items["PreviousPage"]; 

對不起,C#,有沒有代碼,當我回答時,問題沒有用VB.NET標記。有人可以隨意轉換。

+0

這是否適用於對象?如果我走這條路線,我不需要序列化嗎? – danyim

+0

Server.Transfer不是一個新的請求,你仍然在服務器上,不需要序列化。 HttpContext.Items只是一個Dictionary。 –

+0

我剛測試過你的方法,它給了我和我的例子相同的結果。不知何故,當我執行回發時,傳輸到頁面的HttpContext.Current沒有回憶我從當前頁面添加的內容。 – danyim