03. april 2008 - 14:10Der er
9 kommentarer og 1 løsning
ctl00 igen igen
Hej Jeg leder efter en grundlæggende metode til at undgå at de id'er frameworket genererer skaber problemer i min kode.
Jeg skal selvfølgelig kunne tilgå id'er codebehind og kunne validere på id'erne osv.
Jeg skal kunne finde mine kontroller i javascript uden at hardcode en ctlxx-værdi. Javascript og id'er skal virke både hvis det ligger i en aspx-fil eller er inkluderet fra en .js fil.
Da .net arbejder i et kontroltræ, hvor kontroller godt kan have samme ID blot de ligger i en anden kontrol så vil det være uhensigtsmæssigt at ødelægge dette.
Den får altså kontrol0_kontrol0_kontrol0 på afhængigt hvor ofte det er den første kontrol der loades, i et nestet masterpage/usercontrol scenarie vil der ofte være en del hop.
Du har ligeledes ret i at det er tåbeligt at hardcore værdier ind fra en vis kilde. Især fordi dette kontroltræ let kan ændres centralt, så alle dine værdier bliver ubrugbare.
Skal jeg bruge en enkelt, ville jeg skrive
var MinJSVar = <%# TextBox1.ClientID %>
Dynamisk ville en fornuftig backend udvikler godt kunne spørge om hvilke kontroller der er på siden, og lave et JS ark med disse, listet på en ønsket måde.
Altså udfra webcontrols/usercontrols på siden, danne en liste, smide en contenttype på responset "text/javascrpt" og requeste det på siden.
Man kunne lave sit eget kontrol træ, som var lidt mere intuitivt, ex danne variablenavnet af usercontrol.id + "_" + webcontrol.id og tildele dem værdien webcontrol.clientID
Det ville give et resultat som følgende:
var Contact_tbName = "ctrl0_ctrl0_tbname (etc"; var Contact_tbEmail = "ctrl0_ctrl0_tbemail (etc"; var Contact_tbComment = "ctrl0_ctrl0_tbcomment (etc";
Hent dette JS før alle dine andre, og du vil let kunne tilgå dem fra siden.
Svaret er simpelt. Du kan ikke undgå, at .NET prefikser dine ID'er med et control id. Ligeså snart du benytter UserControls eller MasterPages vil der blive prefikset et ID foran dine elementer. Det er den eneste måde .NET kan garantere der ikke bliver oprettet 2 ens ID'er.
Du behøver desuden slet ikke, at hardcode noget som helst.
Gør, som jokkejensen foreslår (gør jeg selv) og så supplere jeg med this.ClientIDSeparator som giver prefiks værdien: )
jokkejensen >> Det lyder som en rigtig god ide at lave sit eget kontroltræ.
Jeg kan også godt fange ideen i at lave en aspx side der returnere "text/javascript" som contenttype og smider usercontrol-id med så den ikke cacher forkert, det har jeg også fået til at virke.
Mit problem er hvordan jeg på min aspx side, der generer javascripten, kan se hvilke kontroller der er på siden der kalder den?
Hvis man vil have listet kontrollerne kan man benytte:
foreach (Control c in Page.Controls) { Response.Write("ID: " + c.ClientID + "<br>"); }
Den vil finde de controller der ligger direkte i bunden af kontrol træet, for mig outputter den:
ID: ctl02 ID: ctl00 ID: ctl03 ID: form1 ID: ctl04
Det er så i form1 at alle mine controller ligger, så jeg er nød til at løbe alle igennem.
Hvis du tilføjer følgende til web.config :<trace enabled="true" pageOutput="true"/> i din system.web vil du i bunden af siden kunne se det fulde control træ, så har du noget at gå ud fra, det er oftes vigtigst kun at tage dem af typen s.w.ui.webcontrols
Sådan her ser mit simple controltræ ud, altså ligger alle mine controller nestet i form, jeg er ikke backend gut, men det må være ret let at lave det om til en fornuftigt struktur.
Ok, det kan jeg godt loope mig igennem og lave om til nogle id'er jeg kan bruge til noget.
Men problemet er igen - hvordan kan jeg se de kontroller fra min genererJS.aspx? Når jeg forsøger at gøre det finder den ingen controls. (Page.Controls.Count giver 0).
Enten forstår jeg ikke hvad du skriver ellers snakker vi forbi hinanden. Jeg prøver at være lidt mere detaljeret.
- Jeg har en masterpage og nogle aspx'er der benytter denne. - På hver af mine aspx'er tilføjer jeg denne til Page.Header: <script language=\"JavaScript\" type=\"text/javascript\" src=\"genererJS.aspx?Login\"></script> - Login skifter så alt efter hvilken side jeg gør det fra så den ikke cacher forkert. - genererJS.aspx vil jeg så gerne have til at lave mit kontroltræ til hver enkelt side.
MEN problemet er så hvordan jeg på genererJS.aspx skal kunne se hvilke kontroller jeg har få f.eks. login.aspx?
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.