09. februar 2006 - 17:57Der er
12 kommentarer og 1 løsning
Usercontrols skal dele "variabel" fra hovedsiden
Jeg er i øjeblikket igang med at lave en side som opretter en Bruger klasse der indeholder en masse variabler/funktioner jeg ofte skal tilgå gennem forskellige usercontrols. Derfor opretter jeg den ved login, og ellers holder den i en session.
Mit spørgsmål er, kan de ikke betale sig at hente Bruger'en ned til hovedsiden og så tilgå de foreskellige variabler og funktioner, så jeg ikke behøver at hente session'en ned i hver usercontrol?
En anden ting er også, at hvis en usercontrol ændre i brugeren, skal den ligge brugeren op i session'en igen for at ændringen skal gælde for næste usercontrol som så skal hente den ned igen.
Kan jeg, og hvordan laver man det smartest, få adgang til objektet fra en usercontrol, når objektet ligger i siden der henter usercontrol'en. Usercontrol'sne bliver hentet dynamisk.
En metode som jeg ofte bruger til at tilgå Session variabler på, er at oprette en static property til hver sessionsvariabel. I "get" metoden hentes sessionsvariablen, og i "set" metoden sættes sessionsvariablen. Du kan evt oprette en klasse til at indeholde alle statiske properties.
public static User { get { return (User)Session["user"]; } set { Session["user"] = value; } }
På denne måde kan alle dine UserControls tilgå Sessions variablene igennem sammne property. Du slipper for eventuelle stavefejl, og hvis du pludselig finder ud af at du vil omdøbe en Sessionsvariabel, skal du bare ændre koden i denne property.
Jeg beklager meget, men jeg har sagt noget forkert til dig. Jeg huskede lidt forkert. Glem alt hvad jeg har sagt om en static property. Jeg tænkede ikke helt klart den dag.
Du kan få tilgang til den side som din UserControl ligger på igennem Page propetien. Hvis du vil hente objecter op fra siden, bliver du dog nød til at caste Page til din typen af din side, hvilket vil give en dårlig løsning.
Jeg foreslår at du laver properties på din UserControl som kan indeholde de objecter den skal bruge fra siden. Så kan du fylde disse properies op i Page_Load.
He he..det er helt iorden... Ja den har jeg også tænkt på, og der kommer så næste problem. Jeg inkludere mine controlls med:
System.Web.UI.UserControl US = new System.Web.UI.UserControl(); US = (UserControl)US.LoadControl(Path); SitePlaceHolder.Controls.Add(US);
Hvordan smider jeg en værdi ind i dem? Jeg har prøvet lidt på at lave en klasse, fx ControlContainer som tager nogen argumenter og egenskaber, som så nedarver fra UserControl, for at på den måde at få variabler ind, men det har ikke lykkedes, så arbejdede ikke så meget mere på det, men er det måden?
og kan det overhovedet betale sig? Tænker på om det er krævende at tilgå sessions?
For at kunne give en værdi til din UserControl, må din UserControl være en Custom usercontrol som nedarver fra UserControl klassen, men som har nogle ekstra properties.
Jeg tror ikke det er specielt krævende at tilgå sessionsvariabler. Hvis du henter værdien ned flere hundrede gange, og har mange variabler i sessionen, kan det måske betyde noget, men ellers ikke.
Man bør begrænse den mængde af data man har liggende i sessions variablen, da den kan kræve meget hukommelse, hvis man har mange samtidige brugere på siden.
Jeg ved ikke helt hvad du mener med "Hvor stor"!. Hvis du mener "Hvor meget hukommelse den bruger", tror jeg ikke du kan se det nogen steder. Hvis du mener "Hvor mange metoder og properties klassen har", kan du få informationer om det igennem Type klassen. I din kode skriver du.
Type myClassType = typeof(MyClass);
Igennem Type klassen, kan du få informationer om metoder, properties, members og en masse andre informationer om din klasse.
ok...ligger du et svar? Jeg skal lige høre...Når man laver en metode "static" betyder det man kan tilgå den overalt ik? Så hvis jeg bruger nogen variabler ofte (som fx min brugerklasse) ville jeg også kunne lave dem som "static" på loginsiden?
At gøre en metode, en property eller en variabel statisk, betyder at man lægger den på klassen, og ikke på instansen. Hvis du f.eks. opretter en variabel med definitionen "private static int testvar" på din Bruger klasse, skal denne tilgåes på følgende måde:
Bruger.testvar;
og IKKE på denne måde:
this.testvar;
Hvis du opretter en statisk variabel, kan du kun have en værdi i den. Der er kun 1 Brugerklasse, og derfor kan der kun være 1 testvar. Almindelige variabler ligger på instansen, så derfor får du 20 variabler, hvis du opretter 20 instanser.
Derfor kan du ikke bruge en statisk variabel eller property til at holde styr på, hvilke brugere der er logget på, da du i såfald begrænser dig til at have 1 bruger pålogget ad gangen (Med mindre de ligger i en collection).
Så det vil sige at hvis jeg på loginsiden bruger en statisk variabel for fx bruger id, kan der ikke være logget flere brugere på med hver forskellige variabler?
En statisk variabel bliver oprettet på klasses, og vil blive husket for hver postback. Derfor kan der kun ligge 1 userid i en statisk variabel. Du kan f.eks. have en statisk variabel, som tæller 1 op når der er en bruger der logger på, og tæller 1 ned når der er en bruger som logger af. På denne måde vil du altid vide hvor mange brugere der er logget på din side.
Ok. Jeg troede at de kun ville gælde for én bruger af gangen, så skal jeg da vist tydeligtvist ha lavet noget om. Takker
Synes godt om
Ny brugerNybegynder
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.