01. august 2003 - 21:15Der er
7 kommentarer og 1 løsning
Usercontrols og codebehind. At arbejde sammen?
Hej NG.
Jeg sidder og leger med UserControls og CodeBehind. Jeg kan ikke helt finde ud af hvordan variable arbejder sammen på tværs af ASPX, ASCX og CodeBehind-sider. Lad os sige jeg har to usercontrols:
RandomImage.ascx: ------------------------ <%@ Control Language="VB" %> <% Dim RandomGenerator As New Random() Dim intRandomInteger As Integer = CInt(RandomGenerator.Next(1, 6)) Response.Write("<img src=""Image0" & intRandomInteger & ".jpg"">") %>
RandomQuote.ascx ------------------------ <%@ Control Language="VB" %> <% Response.Write("Just random integer: " & RandomGenerator.Next(10,100)) %>
Hvis jeg så kalder de to usercontrols fra min ASPX-side, så brokker den sig ved RandomQuote.ascx over Name 'RandomGenerator' is not declared. Usercontrols deler altså ikke variable. Fair nok. Men kan man så i en CodeBehind-fil sætte den variable op, i dette tilfælde en Random(), som kan bruges af alle usercontrols?
Public Class DefaultCodeBehind: Inherits Page 'En eller anden oprettelse af en variabel her, som kan bruges af alle usercontrols... End Class
Det må kunne lade sig gøre?
En anden ting er, at man hører så meget om man ikke må bruge Response.Write() i ASP.NET. Man skal bruge <asp:literal> eller <asp:label>, men hvordan kan man få det til at fungere med CodeBehind og UserControls? I min Wrox-bog bruger de kun Response.Write()...
Joh... Men jeg vil bare oprette et random-objekt i min codebehind-fil, som mine to usercontrols begge kan udnytte direkte. Jeg ville ikke give mig til at oprette nye objekter som jeg selv skruer sammen.
Eksempel: Min ASPX-side er ren HTML og nogle ASP.NET serverkontroller. Nogle klumper af kode på mit site skal genbruges på flere sider. Derfor lægger jeg dem ud i nogle usercontrol/inkluderingsfilerfiler (ascx), så jeg stille og roligt kan lægge stykker kode ind på de sider jeg har brug for dem. Så skal jeg kun rette et sted hvis noget kikser. Selve ASP.NET koden ligger min codebehind-fil. I denne codebehind-fil vil jeg gerne have oprettet et random-objekt og f.eks. nogle databaseobjekter alle som mine usercontrol/inkluderingsfiler kan tilgå. Så kan alle mine usercontrol/inkluderingsfiler bruge de samme objekter fra codebehind-filen, i stedet for jeg skal oprette objekter til brug i hver, seperate usercontrol-side.
Fra dine usercontrols kan du kalde den Page object, som de er en del af.
Så i din page object skal du bare have en property, hvor returnere resultatet.
Som grundregel vil jeg dog anbefale at du ikke binder dine usercontrols og aspx sider så meget sammen. Vær også opmærksom på at du kan sætte properties på din usercontrol fra aspx eller codebehind, så den vej kan du også gøre det.
De 2 usercontrols som du har skitseret ovenfor vil jeg lave som alm. controls.
Vedr. literal og label, så kan du bruge codebehind i dine usercontrols ligesom du kan i dine alm aspx sider.
>De 2 usercontrols som du har skitseret ovenfor vil jeg lave som alm. controls.
Dvs. Du ville lægge de to kontroller direkte på ASPX-siden, ikke i en ekstern fil? Jeg har ellers læst mig til det er god kodepraksis at adskille præsentation og kode?
Så hvis jeg nu gerne vil beholde min nuværende struktur... Kan du så vise mig noget kode, der kan løse mit problem. Jeg er ret nu udi ASP.NET, så jeg er ikke så god til terminologien endnu. Jeg kan nok bedre forstå dit svar hvis jeg ser noget kode. Forløbig tak.
I dine usercontrols har du noget beregning som er standard og der er ikke noget design, derfor vil jeg lave det i en servercontrol i stedet for en usercontrol.
Du vil så kunne kalde den control, ligesom du vil kalde en asp:textbox, altså <minecontrols:randomimage ID="random1" minint="1" maxint="6" runat="server"/>
Ja det er god praksis at adskille præsentation og kode.
Hvad er det for nogle objecter som du vil dele mellem din usercontrol og page object? (Kan være jeg har lettere ved at komme med et forslag til en løsning så)
Okay, jeg ser om jeg kan oprette såden en random-serverkontrol. Den skal så ligge i CodeBehind-filen, ikke? Lidt mere generelt... Lad os nu for eksemplets skyld forestille os dette:
Lad os sige jeg har fem ASCX-filer. I disse fem UserControls skal der i hver kontrol foretages et databasekald. Umiddelbart kunne jeg jeg bare oprette et Connection, Command og DataReader objekt i hver UserControl-fil og så lade det være ved det. Men det lyder ikke så smart ydelsesmæssigt. Hvis jeg nu skulle oprette et fælles Connection, Command og DataReader objekt til disse fem UserControls, hvor skulle jeg så starte hende? Skal objekterne oprettes i ASPX-filen eller CodeBehind-filen? Og hvordan skal de oprettes så objekterne kan "ses" af UserControls?
Og bagefter... Hvordan binder jeg så resultaterne fra datareaderen til en literal eller label på selve ASPX-siden?
Er der nogen der kan hjælpe mig igang med noget kode der viser dette?
Hvis du vil lave opslag i en database for at hente noget statisk indhold ud (?), så har du i mine øjne allerede begået en fejl i designet af din applikation.
Det koster noget mere at have en fælles connection åben, end det gør at oprette den, åbne den, bruge den, lukke den og dræbe den, da du har noget kommunikation kørende mellem to servere. Hvis du er ked af at dine usercontrols skal have den samme kode stående, kan du jo lade dem nedarve fra klasse du selv laver, der så igen nedarver fra System.web.ui.usercontrol ( eller hvad den nu hedder ).
Hvis dine usercontrols skal lave et opslag hver, hver eneste gang din side bliver kaldt, og du måske også har nogle opslag der henter data til selve siden, så kan du også ret hurtigt løbe ind i nogle seriøse perfomance problemer. Et gyldent ord ( eller namespace ) i den sammenhæng ville være System.Web.Caching.
Den metode jeg har brugt på det site jeg arbejder på for tiden, er at opbygge hele min side som en Custom Control ( det der vist er henvist til tidligere med navnet Server Control ), som så selv står for at vise de "indholds øer" man beder om ( eller rettere: skjule dem man ikke vil have ), f.eks: header, menu, footer osv osv.
Alt det statiske indhold, som f.eks det der står i headeren, bliver hentet fra et XmlDocument som man så igen kan transformere om til det format man nu vil have indholdet i.
Hvis du ville lave tricket med et random quote, kunne du jo lave en tabel med dem, og så hente dem alle ud, cache det, og hver gang du vil have et quote, vælger du et random fra din cache.
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.