2009-04-21 6 views
1

Cela semble que cela pourrait être une mauvaise idée, mais je ne peux pas comprendre pourquoi:Mettre un objet en session via une propriété dans ASP.NET

J'ai une classe, Cxyz, propriétés A, B et C. Il a aussi une méthode 'sGetData' qui charge ces trois propriétés de la base de données, et une méthode'SaveData 'qui le sauvegarde.

class cXYZ 

    public property A as string... 
    public property B as string... 
    public property B as string.. 

    public sub sGetData()... 
    public sub sSaveData()... 

end class 

Un formulaire en ligne a la propriété suivante:

private property xyz() as cXYZ 
get 
    return session("myXYZ") 
end get 
set (value as cXYZ) 
    session("myXYZ")=value 
end set 
end property 

Et les événements suivants:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

if not ispostback() then 
    xyz=new cXYZ() 
end if 

end sub 

Protected Sub ButtonLoad_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonLoad.Click 

    //Can now reference the class 
    txtA.text=xyz.A 
    txtB.text=xyz.B 
    txtC.text=xyz.C 

end sub 


Protected Sub ButtonSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonSave.Click 

    //Can now reference the class 
    xyz.A=txtA.text 
    xyz.B=txtA.text 
    xyz.C=txtC.text 

    xyz.sSaveData() 

end sub 

Je peux voir certains frais généraux avec sérialisation/désérialisation pour chaque propriété référence- il pourrait être vaut la peine de le faire:

Protected Sub ButtonSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonSave.Click 

    dim localxyz as cXYZ=xyz 

    localxyz .A=txtA.text 
    localxyz .B=txtA.text 
    localxyz .C=txtC.text 

    xyz=localxyz 

end sub 

Autre que cela, des vues sur pourquoi c'est bon ou mauvais? La classe n'est pas grande, elle maintient l'état du formulaire. Webforms sucer, etc n'est pas très utile ..

Répondre

0

J'amélioreraient que peu:

private _xyz as cXYZ = nothing 

private property xyz() as cXYZ 
    get 
     if _xyz is nothing then _xyz = TryCast(session("myXYZ"), cXYZ) 
     return _xyz 
    end get 
    set (value as cXYZ) 
     _xyz = value 
     session("myXYZ")=_xyz 
    end set 
end property 
+0

Pourquoi l'option trycast si la variable locale n'est rien? La seule raison que je peux penser est de ramasser automatiquement la copie de session de l'objet si elle n'avait pas été instanciée dans le modèle d'événement. (qui peut être valide - disons sur un second formulaire Web qui récupère les données du premier) – ScottK

+0

Vous pouvez utiliser DirectCast pour augmenter les performances, mais si variable n'est rien, DirectCast ou TryCast le cast avec succès, sauf si le type de données n'est pas le type de référence. –

0

Je pense que c'est ok. Je voudrais ajouter une variable pour stocker l'objet pour améliorer les performances.

Quelque chose comme ceci:

private _xyz as cXYZ = nothing 
private property xyz() as cXYZ 
    get 
     if not _xyz is nothing then 
     return _xyz 
     else 
     return session("myXYZ") 
     end if 
    end get 
    set (value as cXYZ) 
     _xyz = value 
     session("myXYZ")=value 
    end set 
end property 
0

Tant que votre objet est sérialisable vous êtes OK. Ne tenez simplement aucune référence d'objet non géré dans votre session - sinon vous aurez des problèmes une fois que vous passerez de l'état de session en cours à une ferme Web.

Questions connexes