2009-04-21 4 views
1

Dies scheint, wie es eine schlechte Idee sein könnte, aber ich kann nicht herausfinden, warum:Putting ein Objekt in der Sitzung über eine Eigenschaft in ASP.NET

Ich habe eine Klasse, CXYZ, mit Eigenschaften A, B und C. Es hat auch eine Methode 'sGetData', die diese drei Eigenschaften aus der Datenbank lädt, und eine Methode'SaveData ', die es zurückspeichert.

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 

A webform hat folgende Eigenschaft:

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

und die folgenden Ereignisse:

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 

ich für jede Eigenschaft einigen Aufwand mit Serialisierung/Deserialisierung sehen referenz es sein könnte es lohnt sich, dies zu tun:

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 

Abgesehen davon, Ansichten, warum dies gut oder schlecht ist? Die Klasse ist nicht groß, sie behält den Formstatus bei. Webforms saugen, etc ist nicht sehr nützlich ..

Antwort

0

ich, dass etwas verbessern würde:

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

Warum die Trycast-Option, wenn die lokale Variable nichts ist? Der einzige Grund, den ich mir vorstellen kann, ist die automatische Abholung der Sitzungskopie des Objekts, wenn es nicht im Ereignismodell instanziiert wurde. (Das kann gültig sein - sagen Sie auf einem zweiten Webformular, das Daten von dem ersten aufnimmt) – ScottK

+0

Sie können DirectCast verwenden, um die Leistung zu erhöhen, aber wenn Variable nichts ist, wird DirectCast oder TryCast es erfolgreich umsetzen, es sei denn, Datentyp ist nicht Referenztyp. –

0

Ich denke, es ist in Ordnung. Ich würde addicionaly eine Variable behalten, um das Objekt zu speichern, um Leistung zu verbessern.

Etwas wie folgt aus:

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

Solange Ihr Objekt serialisierbar ist, dass Sie in Ordnung sind.

Halten Sie einfach keine nicht verwalteten Objektreferenzen in Ihrer Sitzung fest - sonst werden Sie in Schwierigkeiten geraten, sobald Sie vom Sitzungsstatus 'in Bearbeitung' in eine Webfarm wechseln.