Avatar billede segato Nybegynder
23. oktober 2004 - 11:15 Der er 13 kommentarer og
1 løsning

Masterpages der ændre tag id?

Når man arbejder med masterpages i whidbey og tilføjer en contentpage. Alt inden på den contentpage ændre alle dine tags id's til id navn + contentholderens navn hvilket er ret irretrende hvis man bruge javascript til at hive elementerne ud. Nogen der har en løsning hvor man kan forhindre dette?
Avatar billede snepnet Nybegynder
23. oktober 2004 - 12:26 #1
jeg har ikke arbejdet så meget med whidbey, men det lyder som om en masterpage implementerer INamingContainer, og at ContentPages lægger sig som underkontrollen til den aktuelle MasterPage.
hvis det er tilfældet er det ikke noget du kan komme ud over, da det er garanteret af framworket at der genereres unikke id's under en NamingContainer.
men... det er ikke noget jeg har kigget nærmere på, og jeg er på vej ud af døren.

jeg kigger på det når jeg er hjemme igen.

mvh
Avatar billede snepnet Nybegynder
23. oktober 2004 - 18:35 #2
er du der segato ?
Avatar billede segato Nybegynder
24. oktober 2004 - 09:18 #3
Det kan du tro jeg er:D Det er ikke unique id's men blot det id man selv satte og så navnet på placeholderen(containeren). Og jeg tror du har ret det er der ik så meget at gøre ved. Man kunne løse det ved at bruge name i stedet for id i mine html tags men getelementsby id virker paradoksalt nok kun på id på trods af der også er en getelementbyid. Jeg har tænkt over om der er andre attributter kan kan sætte på en html tag og så finde den tag ud fra satte tag. Har ikke rigtigt fundet en god løsning endnu så en løsning på javascriptdelen vil selvfølgelig og kast epoint af sig:D
Avatar billede snepnet Nybegynder
24. oktober 2004 - 11:51 #4
Man får vanligvis en fejl hvis man prøver at poste en form, hvor der er serverkontroller med samme id - prøve f.eks. sådan en kode her :

TextBox tb1 = new TextBox();
tb1.ID = "SomeTextBox";
Form1.Controls.Add(tb1);

TextBox tb2 = new TextBox();
tb2.ID = "SomeTextBox";
Form1.Controls.Add(tb2);

Det vil godt nok give dig begge tekstbokse frem på skærmen, men lige så snart du prøver at submitte formen, vil du få en fejl af frameworket... typisk at FindControl
(...) kræver at kontrollerne har unikke id's.

html-en der genereres er som følger :
<input name="SomeTextBox" type="text" id="SomeTextBox" />
<input name="SomeTextBox" type="text" id="SomeTextBox" />

Mht. til name og id og den slags, så kan du prøve dette lille forsøg :

Tag bare teksboksene fra før, og prop dem ind i en container af en art, sådan her :

// ---
SomeContainer container = new SomeContainer();

TextBox tb1 = new TextBox();
tb1.ID = "SomeTextBox";
container.Controls.Add(tb1);

TextBox tb2 = new TextBox();
tb2.ID = "SomeTextBox";
container.Controls.Add(tb2);

Form1.Controls.Add(container);
// ---

og så sørger du for at skrive SomeContainer sådan her :

// ---
public class SomeContainer : Control
{
    protected override void CreateChildControls()
    {
        base.CreateChildControls ();           
        Controls.Add(new Panel());
    }
}
// ---

Ovenstående vil give nøjagtig samme html for tekstboksene :
<input name="SomeTextBox" type="text" id="SomeTextBox" />
<input name="SomeTextBox" type="text" id="SomeTextBox" />
(læg for øvrigt mærke til at name sættes til det samme som id'et)

Men.... hvis du så sørger for at SomeContainer implementerer INamingContainer (det er et tomt interface), så sker der ting og sager :

SomeContainer kommer til at se sådan her ud :
// ---
public class SomeContainer : Control, INamingContainer
{
    protected override void CreateChildControls()
    {
        base.CreateChildControls ();           
        Controls.Add(new Panel());
    }
}
// ---

Og den resulterende html bliver som følger :

<input name="_ctl0:SomeTextBox" type="text" id="_ctl0_SomeTextBox" />
<input name="_ctl0:SomeTextBox" type="text" id="_ctl0_SomeTextBox" />

Der er stadig det samme problem med at kontrollerne ikke har unikke id's under namingcontaineren..... hvis du ikke selv sætter .ID får du bare sådan en her :

<input name="_ctl0:_ctl0" type="text" />
<input name="_ctl0:_ctl1" type="text" />

Nå.... men lige for at runde af - så kan du godt benytte det id der genereres programmatisk f.eks. sådan her :

//--
SomeContainer container = new SomeContainer();

TextBox tb1 = new TextBox();           
container.Controls.Add(tb1);
tb1.ID = tb1.UniqueID;

TextBox tb2 = new TextBox();
container.Controls.Add(tb2);
tb2.ID = tb2.UniqueID;

Form1.Controls.Add(container);
//--

Det giver dig nedenstående :

<input name="_ctl0:_ctl0" type="text" id="_ctl0__ctl0" />
<input name="_ctl0:_ctl1" type="text" id="_ctl0__ctl1" />

På den måde har du altså det resulterende id tilgængeligt i koden, og du kan bruge den i forbindelse med script-generering og den slags, og på den måde sikre, at det er ligemeget om du sætter dine kontroller direkte ind på en side, eller om du sætter dem ind i en namingcontainer af en art... scripts skal nok virke alligevel.
(men det kræver self. at du skriver dem i din serverside kode - med de parametre der skal til.... jeg vil gerne skrive et lille eksempel på det, hvis det skulle være).

Men... her til sidst, så må jeg jo lige nævne, at jeg ikke har været inde og læse noget specifikt omkring masterpages mv.

Håber du kan bruge alt mit ævl til et eller andet... hvis der er noget der er helt ulæseligt/uforståeligt må du lige sige til.

mvh
Avatar billede segato Nybegynder
24. oktober 2004 - 15:56 #5
Har prøvet at gå væk fra id ved at navigere i documnet vi nextSibling parent osv. men nu ser det ud som det er et postback problem med whidbey. Tror det er sidste gang jeg udvikler i en beta version. Vil forsøge at lege med dit eksempel takker mange gange for din interresse.
Avatar billede snepnet Nybegynder
24. oktober 2004 - 16:09 #6
det var så lidt :o)

jeg har ikke umiddelbart observeret problemer med at arbejde i whidbey og køre på v2.0 af frameworket.
jeg har godt nok kun hygget mig lidt med det en enkelt week-end, men tog jeg en solution med 35 projekter, hvor det ene var en web-frontend, hvor alt er opbygget dynamisk.... alt syntes at fungere helt fint efter jeg havde fikset nogle whidbey-specifikke ting omkring page-direktivet (og så foretog jeg mig ikke andet).

jeg tror ikke jeg ville være bekymret over at rulle over på den, selv om den er i beta, men jeg vil meget gerne høre hvis du støder på noget klamt.

mvh
Avatar billede segato Nybegynder
25. oktober 2004 - 09:21 #7
Kan man ikke give point for en kommentar. Er lidt ny med sitet men det ville da til tider være relevant med point til kommentar da jeg ofte ser kommentar der er point værd?
Avatar billede flim Nybegynder
25. oktober 2004 - 09:23 #8
Du kan bede dem der har kommenteret, om at smide et svar - kun på den måde kan du give point
Avatar billede snepnet Nybegynder
25. oktober 2004 - 12:28 #9
jeg kan da lægget et svar hvis du vil af med noget segato :o)
mvh
Avatar billede segato Nybegynder
25. oktober 2004 - 22:59 #10
Ja sneppet sys jeg du har fortjent.
Avatar billede segato Nybegynder
25. oktober 2004 - 23:01 #11
Jeg har klikket på accepter håber det gav dig point? Ellers reply lige hvad jeg skal gøre!
Avatar billede snepnet Nybegynder
25. oktober 2004 - 23:58 #12
hmmm.... tror nok du skal klikke på mit navn, så det bliver markeret inden du trykker accepter.
mvh
Avatar billede segato Nybegynder
26. oktober 2004 - 10:03 #13
Ja tror du har ret nu er dit nick væk fra min menu. Skal jo lige lære sitet at kende syntes forresten det er ret fedt men kan dele siden viden på denne måde!
Avatar billede snepnet Nybegynder
26. oktober 2004 - 11:58 #14
ja det er et fedt system de har fået skruet sammen herude :o) ... dejlig ukompliceret måde det kører på synes jeg.
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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