16. marts 2005 - 17:09Der er
7 kommentarer og 1 løsning
problemer med userkontrol
Jeg spurgte for kort tid siden om nogle ting der resulterede i det svar at en del på vores site skulle laves om. Vi har en .aspx der inkluderer andre .aspx-sider ud fra nogle medsendte parametre og dette skal laves om til at fungere som userkontroller. Det er her jeg er stødt på lidt problemer.
I min default-side sætter jeg nogle parametre (fx sprog og billedekilde) - disse er blevet sat med sessions, men jeg ville tro at man med en usercontrol kan nøjes med at sætte det som en normal variabel fx;
Public SITE_LANG As String SITE_LANG = "2"
Men forsøger jeg at kalde SITE_LANG fra codebehind-filen til min usercontrol får jeg bare at vide at SITE_LANG ikke er deklareret - hvordan skal det sættes op får at jeg kan bruge mine variabler fra default.aspx på mine usercontrols?
En anden ting er, at det ser ud som om jeg ikke kan kalde Server.HtmlEncode(noget) samt Server.UrlEncode(noget) i codebehind til usercontrollen - hvorfor nu ikke det?
<parent_page> skal vel egentlig være "parentpage.control", hvis du f.eks. har en "literal" på din default.aspx side skal du i din usercontrol skrive; protected dims as literal
"senere" (i din uc) kan du så skrive f.eks. dims.Text = "test" og så vil teksten i din literalcontrol blive ændret/skrevet. Du kan også bruge dine egne klasser og andre usercontrols.
lige et par kommentarer.... du slipper ikke for at lægge dine variable i session ved at flytte dem til en usercontrol (hvis det altså er variable du forventer skal huskes mellem roundtrips). afhængig af din variabel kan vælge enten at lade den blive "husket hos klienten" - altså rendere den med ud til klienten, og læse den igen når den kommer tilbage... ViewState er beregnet til den slags. Alternativt skal du - som du gør nu - gemme variablen på serveren hvor Session så er en oplagt muligt... Du har desuden Cache og Application til den slags også.
med hensyn til det med at tilgå en sides variable fra en usercontrol - så er det normalt ikke noget særlig oplagt design for en usercontrol. hvis kontrollen har brug for at kende nogle variable når den eksekverer - vil det være mere oplagt at du har nogle properties på den, som så kan sættes af den respektive container (f.eks. en side).
hvis du vil tilgå en bestemt variabel på den side kontrollen lever på, vil du typisk gøre brug af noget som dette :
// en property på siden (vi sige at klassen hedder _Default: Public ReadOnly Property SomeString() As String Get Return "SomeString" End Get End Property
// i din kontrol Private SomeStringFromPage As String = CType(Me.Page, _Default).SomeString
og du kan self. gøre noget tilsvarende hvis det er en eller ander kontrol på siden du er ude efter. (jeg er ikke så skrap til vb.... håber det kan kompilere ;o)
men... på den måde har du låst din brugerkontrol fuldstændig fast til én enkelt side, hvorved en af de grundlæggende fiduser (genbrug) ved en usercontrol, er umulig.
du kan self. sikre mulighed for genbrug af kontrollen med baseklasser eller interfaces, men det bliver en mere frameworks-agtig struktur du så er ude i.
før jeg begynder at eksperimentere alt for meget med dette skal jeg måske lige forklare min struktur hvis der evt er noget mere hensigtsmæssigt.
jeg har en default.aspx som altid vises. Den indeholder menu, top, bund, styles etc. Ud fra hvad der så står i adresselinien skal der inkluderes en underside i default.
står der fx www.domæne.dk/dims så skal siden dims.xxx inkluderes, står der /something skal siden something.xxx inkluderes osv. De sider som bliver inkluderet er alle unikke og skal ikke umiddelbart genbruges - de er en sammenblanding af rent html-indhold og andre er funktionelle sider med fx søgefelter osv.
både på default og alle undersider skal der inkluderes billeder alt efter hvilket domæne man er på. Står der www.domæne1.dk bliver der hentet variabler fra en database svarende til det domæne og de variabler bestemmer altså fra hvilken mappe der skal hentes billeder etc - går man ind på www.domæne2.dk bliver der hentet nogle andre værdier fra databasen og det kan så betyde at billederne skal hentes fra en anden mappe.
Derfor er der ikke noget genbrug eller - vil jeg gætte på - hokus pokus i dette og jeg er desværre nok lidt for præget af at jeg altid har arbejdet med asp.
Ud fra de oplysninger - er det så stadig overstående jeg skal ud i? Hvis kan jeg så lokke en til at give eksemplet på hvordan jeg får en af følgende overført til min kontrol (dims.ascx) fra default.aspx;
hvis du fra en side indsætter en kontrol : Dims dims = (Dims)LoadControl("~/UserControls/Dims.ascs");
kan du bare sætte en property på kontrollen sådan her :
dims.SomeString = "ABC";
den property vil så være angivet på kontrollen som noget i denne stil :
private string _someString;
public string SomeSring { get{return _someString;} set{_someString = value;} }
hvis det er noget du alligevel lægger i session - kan du jo også bare hente det der inde fra kontrollen, hvis du synes det er nemmere i forhold til det du har nu.
altså... du kan jo lave en private property - der hopper direkte i session sådan her :
du må lige sige til hvis du ikke er med på hvad jeg mener. ... du er også velkommen til at skrive hvad jeg kan fange dig på på messanger ell... så skal jeg nok fange dig, hvis der er noget du gerne vil have afklaret.
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.