Avatar billede montago Praktikant
27. september 2007 - 14:46 Der er 6 kommentarer og
1 løsning

Persistente objekter imellem page request

Jeg vil gerne oprette en række objekter som ikke genloades imellem pagerequests (eksistere selvom jeg trykker på alm link)

Jeg ved der findes de 9 metoder (http://msdn.microsoft.com/msdnmag/issues/03/04/ASPNETUserState/) men vil lige høre hvordan jeg løser dette problem:

Objekterne henter hver især deres HTML fra forskellige WebRequests, HTML'en gemmes i deres private variable:

class obj
{
  string HTML;
  public Load(){ HTML = ..... }
}

hver object indeholder også en reference til det Label() hvor de skal udskrives:

class obj
{
  string HTML;
  Label P;
  public obj(Panel pin){ this.P = pin }
  public Load(){ HTML = ..... }
  public show(){ P.Text = HTML }
}

For at lette mit arbejde med at holde styr på hvilket objekt jeg skal aktivere, har jeg lavet en Indexer som holder på disse objekter:

class objColl
{
  List<obj> LO;
  public Add(obj O){...}
  int find(string name){...}
  public obj this[string name]{ get()...}
}


----------

nu er spørgsmålet - hvordan hulan gør jeg sådan at disse objecter med deres indexer bliver gemt imellem page requests ? - sådan at jeg ikke skal initialisere dem - men blot kan gen-aktivere dem...

jeg funderer stadig lidt over det...
Avatar billede montago Praktikant
27. september 2007 - 14:48 #1
det skal siges at jeg helst ikke skal bruge viewstate eller postback !
Avatar billede montago Praktikant
27. september 2007 - 14:49 #2
OG... objekterne er selfølgelig oprettet pr bruger.

hvilket får mig til at kigge på Session -- og brug af [serializable]
Avatar billede neoman Novice
27. september 2007 - 19:50 #3
serializable er mig bekendt kun hvis du ønsker at gemme ting i viewstate, da det skal sendes til klienten or retrieves derfra, mens  session er in-memory og skulle være lige ud
Avatar billede mikkel_sommer Nybegynder
28. september 2007 - 10:35 #4
Som du selv er inde på kan du vel anvende Session a la det her:

Session["myobject"] = myObject;

MyObject myObject = (MyObject)Session["myobject"];
Avatar billede montago Praktikant
28. september 2007 - 11:39 #5
Okay så langt så godt - jeg har gemt mine objekter i Session, og kan kalde dem frem igen...

hvert objekt bliver instansieret med en reference til en Placeholder på siden hvor de skal vises -- denne reference bliver vidst ikke gemt !?

hvis jeg fx klikker på et link på en gadget bliver hele siden hvid ?

---------
GadgetList GL;

void page_load(){
if( session["Gadgetlist"] == null ){
  GL = new GadgetCollection();
  GL.add( new Gadget( placeholder ) );
  session["Gadgetlist"] = GL
}else{
  GL = (GadgetCollection)session["Gadgetlist"]
}
GL.ShowAll(); // gennemløber alle Gadgets for at vise deres HTML.
}

class GadgetCollection{
  void ShowAll(){
    foreach(...){
      G.show();
    }
  }
}

class Gadget{
  placeholder output;
  void Gadget(placeholder PH){
    output=PH;
    Label P = new Labet(); 
    output.controls.add(P);
  }
  void Show(){
    P.Text = /HTML/;
  }
}
Avatar billede mikkel_sommer Nybegynder
28. september 2007 - 11:48 #6
Er der ikke en fejl der hvor du laver din label:

Label P = new Labet();  ->  Label P = new Label();
Avatar billede montago Praktikant
28. september 2007 - 12:02 #7
Løsningen er at parse referencen af placeholderen ned til Show, og tjekke på om min Label-control existere i kontrollen... hvorefter jeg kan Add den hvis den mangler

det funker nu...

    internal void Show(PlaceHolder PH)
    {
        if (!PH.Controls.Contains(P)){
            PH.Controls.Add(P);
        }
        P.Text = GadgetHTML;
    }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester