2011-10-26 9 views
2

Pour mon application, j'ai une page qui redirige vers une autre page (dans la même application) via Server.Transfer. Je dois faire cela parce que la page d'origine a un objet que j'ai besoin d'accéder en utilisant la propriété Page.PreviousPage.Server.Transfer perdant des variables locales

Une fois que ma page "destination" a été entièrement chargée, un clone profond local que j'ai fait de l'objet de la page source est soudainement libéré de la mémoire une fois que j'effectue un postback? Est-ce par conception - quelque chose à voir avec le Server.Transfer?

Un exemple ...

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" 

A ce moment, tout fonctionne comme il devrait. Les trucs ont été clonés correctement et tout va bien.

(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! 

C'est par ici que j'ai le problème. Je suppose que Server.Transfer arrête toute association avec la page source après le chargement de la nouvelle page.

Existe-t-il un meilleur moyen de passer des objets inter-pages?

+0

Si vous mettez un bouton et un côté serveur cliquez sur cette page pouvez-vous accéder à votre objet à partir de l'événement click? peux-tu montrer du code? –

+0

Ce que j'ai dit pourrait être un peu flou, mais je ne connais pas d'autre moyen de le dire. – danyim

+1

Cela me sent mauvais. Vous pouvez sûrement stocker l'objet d'origine dans un autre conteneur et le retirer dans le chargement de la page re-dirigé? – Graham

Répondre

2

Il suffit de passer une variable dans le HttpContext, vous devrez gérer votre casting, pas sûr de ce Page.PreviousPage est:

Page courante:

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

Transféré à la page:

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

Désolé pour le C#, il y a n'était pas un code et la question n'était pas marquée avec VB.NET quand j'ai répondu. Quelqu'un se sent libre de convertir.

+0

Est-ce que cela fonctionne avec des objets? N'aurai-je pas besoin de sérialiser si je vais sur cette route? – danyim

+0

Server.Transfer n'est pas une nouvelle demande, vous êtes toujours sur le serveur, pas besoin de sérialiser. HttpContext.Items est juste un dictionnaire. –

+0

Je viens de tester votre méthode, et elle me donne le même résultat que mon exemple. D'une manière ou d'une autre, lorsque j'effectue une publication, le HttpContext.Current à la page Transféré à la page n'a aucun souvenir de ce que j'ai ajouté à partir de la page en cours. – danyim

Questions connexes