HDSoftware Skrevet 17. juli 2008 Del Skrevet 17. juli 2008 Heisan folkens WEB appen min har en del klasse og jeg liker klasser som tar vare på seg selv slik at jeg i programmet mitt ikek trenger tenke mer på dette. Derfor tenkte jeg i min uvitenhet at jeg kunne benytte constructoren til å få til dette, men akk: Følgende kode er prøvd uten hell: public class SomeClass : System:Web.UI.Page { public string SomeProperty; private int SomePrivateProperty; public SomeClass(string SessionID) { RestoreState(SessionID); } private void RestoreState(string SessionID) { this = (SomeClass)Session[SessionID]; } public void SaveState(string SessionID) { Session.Remove(SessionID); Session(SessionID) = this; } } Dette kompillerer ikke fordi THIS er ReadOnly, og jeg har selvsagt full forståelse for dette. Men finnes det en annen måte å gjøre dette enkelt på? Jeg kan jo selvsagt ta bryet og utvide SaveState med å lagre alle variablene jeg trenger, men vedlikeholdet på dette er jo håpløst. Lenke til kommentar
j000rn Skrevet 17. juli 2008 Del Skrevet 17. juli 2008 Å lagre hele siden (med kontroller og alt mulig) i Session blir bare tøys. Bruk heller eksempelet mitt fra igår, eller gjør sånn som dette: internal class MyState { private MyState() //private slik at den ikke får lages utenifra. {} // En haug med properties her (private field + internal property). // .... internal void SaveState() { HttpContext.Current.Session["MyState"] = this; } internal static MyState GetState { get { return (HttpContext.Current.Session["MyState"] as MyState) ?? new MyState(); } } } Lenke til kommentar
HDSoftware Skrevet 18. juli 2008 Forfatter Del Skrevet 18. juli 2008 Å lagre hele siden (med kontroller og alt mulig) i Session blir bare tøys. Bruk heller eksempelet mitt fra igår, eller gjør sånn som dette: internal class MyState { private MyState() //private slik at den ikke får lages utenifra. {} // En haug med properties her (private field + internal property). // .... internal void SaveState() { HttpContext.Current.Session["MyState"] = this; } internal static MyState GetState { get { return (HttpContext.Current.Session["MyState"] as MyState) ?? new MyState(); } } } OJ!! Return(HttpContext............ as MyState) ?? new MyState(); var ny for meg. Hva gjør denne egentlig? Hvis jeg skal gjette så henter den ut en session var, caster den til MyState, oppretter en ny instans av MyState og lagrer den castede instansen i den nye instansen. Noe slik? Lenke til kommentar
steingrim Skrevet 18. juli 2008 Del Skrevet 18. juli 2008 ?? er en kjekk operator. Den returnerer den første av operandene som ikke er null. (HttpContext.Current.Session["MyState"] as MyState) prøver å caste til MyState, men som du kanskje vet så er as en sikker cast, den returnerer null hvis objektet ikke er av riktig type. Dermed vil HttpContext.Current.Session["MyState"] ?? new MyState() returnere enten objektet i sesjonen, eller hvis objektet er null eller ikke av riktig type et nytt objekt av MyState (new MyState). Lenke til kommentar
HDSoftware Skrevet 18. juli 2008 Forfatter Del Skrevet 18. juli 2008 ?? er en kjekk operator. Den returnerer den første av operandene som ikke er null. (HttpContext.Current.Session["MyState"] as MyState) prøver å caste til MyState, men som du kanskje vet så er as en sikker cast, den returnerer null hvis objektet ikke er av riktig type. Dermed vil HttpContext.Current.Session["MyState"] ?? new MyState() returnere enten objektet i sesjonen, eller hvis objektet er null eller ikke av riktig type et nytt objekt av MyState (new MyState). Glimrende. Det betyr at dette egentlig er omtrendlig det samme som dette: MyState m = new Mystate; try { m = (MyState)Session["MyState"]; } catch {} return m; Lenke til kommentar
j000rn Skrevet 18. juli 2008 Del Skrevet 18. juli 2008 MyState m = new Mystate; try { m = (MyState)Session["MyState"]; } catch {} return m; Nja, egentlig betyr det: if( Session["MyState"] != null && Session["MyState"] is MyState ) return (MyState)Session["MyState"]; else return new MyState(); Unngå bruk av try/catch hvis du kan gjør det på en bedre måte Lenke til kommentar
HDSoftware Skrevet 18. juli 2008 Forfatter Del Skrevet 18. juli 2008 MyState m = new Mystate; try { m = (MyState)Session["MyState"]; } catch {} return m; Nja, egentlig betyr det: if( Session["MyState"] != null && Session["MyState"] is MyState ) return (MyState)Session["MyState"]; else return new MyState(); Unngå bruk av try/catch hvis du kan gjør det på en bedre måte Tøfft. Kjennte ikke til IS. Takker for alle tips Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå