Avatar billede sholm Nybegynder
03. april 2008 - 14:10 Der 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.

Nogen der har nogle gode retningslinjer?
Avatar billede jokkejensen Novice
03. april 2008 - 16:31 #1
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.

/J
Avatar billede jokkejensen Novice
03. april 2008 - 16:34 #2
jeg ved ikke helt, men måske skal du også lige paste Usercontrol.id med over i QS til din genererJS.aspx..

Så vil browseren ikke cache arket som værende ens over alle sider.

Ex

script type="text/js" src="genererJS.aspx?Contact"
Avatar billede kalp Novice
03. april 2008 - 19:59 #3
sholm >>

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: )
Avatar billede sholm Nybegynder
04. april 2008 - 08:34 #4
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?
Avatar billede jokkejensen Novice
04. april 2008 - 12:58 #5
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

/JJJ
Avatar billede jokkejensen Novice
04. april 2008 - 13:00 #6
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.

__Page    ASP.default_aspx    816    0    0
    ctl02    System.Web.UI.LiteralControl    170    0    0
    ctl00    System.Web.UI.HtmlControls.HtmlHead    57    0    0
        ctl01    System.Web.UI.HtmlControls.HtmlTitle    33    0    0
    ctl03    System.Web.UI.LiteralControl    14    0    0
    form1    System.Web.UI.HtmlControls.HtmlForm    555    0    0
        ctl05    System.Web.UI.LiteralControl    17    0    0
        myTB    System.Web.UI.WebControls.TextBox    43    0    0
        ctl06    System.Web.UI.LiteralControl    6    0    0
        myCB    System.Web.UI.WebControls.CheckBox    47    0    0
        ctl07    System.Web.UI.LiteralControl    18    0    0
    ctl04    System.Web.UI.LiteralControl

Jeg kan ikke rigtigt hjælpe mere, eller det vil tage mig lidt tid at lave det praktisk, er mere løsningsarkitet på sådanne..

Men til gængæld vil jeg da gerne se løsningen, jeg har efterspurgt det flere gange i vores backend afdeling :)

/JJ
Avatar billede sholm Nybegynder
04. april 2008 - 15:03 #7
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).
Avatar billede jokkejensen Novice
04. april 2008 - 15:15 #8
Min siger 5 stk.

Og du har nogle elementer med runat="server" ?

/JJ
Avatar billede sholm Nybegynder
07. april 2008 - 10:31 #9
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?
Avatar billede sholm Nybegynder
13. august 2008 - 11:33 #10
Den døde vist...
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

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



IT-JOB

Saab Danmark A/S

Infrastructure Architect

Cognizant Technology Solutions Denmark ApS

Test Manager

Saab Danmark A/S

Test Manager

Politiets Efterretningstjeneste

Netværks- og/eller firewallspecialister i PET