[ Zdravo_djaci @ 08.06.2010. 13:51 ] @
Pozdrav.
Koristim Framework 3.5.
Server automatski dodeljuje serverskim kontrolama prefiks u njihovim ID-evima (ctl00_TheContent_ucGL...........).
Da li postoji mogucnost da se u code behind-u sazna za taj prefix, jer imam potrebu da kreiram dinamicki java script koji ce na klijentskoj strani da
pristupa kontrolama. Kontrole mi se nalaze u user kontroli ciji se naziv takodje nalazi u glupom prefiksu koji je dodat i taj naziv moze da varira, tako da nikako ne smem da zakucavam
prefiks kontrola u JavaScriptu.

Zna li neko resenje ovog problema, koje je fleksibilno i koje ce dozvoliti da user controlu koristim gde god hocu.
Najbolje bi bilo kad bi postojala metoda na serveru koja bi mi vratila taj prefix.
[ SehaxX @ 08.06.2010. 14:06 ] @
Ja sam u slucaju jQuery-a koristio ovaj code, nisam siguran da li radi u code-behinde.

Code (csharp):

    IDControle.ClientID;
 
[ Zdravo_djaci @ 08.06.2010. 14:22 ] @
Postoji ClientID za sve kontrole u code behind-u, ali i pored toga mi ispisuje ID koji je dodeljen na serverskoj strani.

Primer :

Code behind :


btAddNew.OnClientClick = "return SelectItem(" + index + ",'"+((TextBox)guest.ControlList[3]).ClientID + "');";

Client side :

function SelectItem(index,cl) {

alert(cl);
return false;
}


Ovaj alert mi alertuje ID kontrole bez dodatih prefiksa :(
[ deerbeer @ 08.06.2010. 14:40 ] @
Ne verujem da ces automatski saznati taj prefiks , jer ga asp dodeljuje na osnovu layouta strane ,
sto ce reci u zavisnosti od hijerarhije tih kontrola unutar jedne aspx strane ili ascx kontrole .
Tako da kontrola sa prefiksom ctl00_imekontrole je recimo prva na aspx strani , neka kontrola unutar nje bi bila ctl00_01_ .itd
[ Zdravo_djaci @ 08.06.2010. 14:49 ] @
Ako je tako onda je mogucnost klijentskog programiranja svedena na minimum. Mora da postoji neko resenje.
[ mmix @ 08.06.2010. 15:48 ] @
Sta ti je guest? I zasto vuces kontrolu iz ControlList?

Da bi ClientID funkcionisao, u trenutku kad vuces property taj element mora da bude u Controls hijerarhiji stranice (Dakle, u page.Control, ili u foreach (control in Page.Controls) => Controls ili za svaku od tih kontrola u njegovom Controls itd, sto dublje ides, duze je ClientID ime. Ako kontrole drzis u nekom svom collectionu koji jos nije ni povezan za hijerarhiju strnice onda ni CLientID ne moze da se zna.

[ Zdravo_djaci @ 08.06.2010. 21:40 ] @
Guest mi je klasa koja u sebi sadrzi niz kontrola.
Broj tih Guest-ova mi zavisi od podataka iz baze.
Instanca te klase se koristi u user kontroli. User kontrola mi prikazuje te guestove sa kontrolama na koje oni referenciraju.
Kada kliknem negde, hocu da, preko javascripta, pristupim odredjenoj kontroli (sada na klijentu). Generisanje poziva tog javascripta mogu jedino da radim u user controli,
jer mi user kontrola sadrzi metodu za generisanje dinamickog HTML-a (i javascript poziva funkcija) koji predstavlja niz tih Guestova.



[ mmix @ 08.06.2010. 21:56 ] @
kako se renderuje guest?

deluje mi da si mnogo zakomplikovao sve ovo i da si to mogao i mnogo jednostavnije da odradis.

Pazi ovako, ako te kontrole nisu direktno u hijerarhiji server-side page objekta (kroz Controls kolekcije) onda neces dobiti jedinstven ClientID. Jednostavno akd ti pozoves ((TextBox)guest.ControlList[3]).ClientID taj textbox nema svog parenta, samim tim server side kod ne zna GDE se kontrola nalazi niti kako da je jedinstveno imenuje pa ti vraca samo ID kontrole bez prefixa.
[ Zdravo_djaci @ 09.06.2010. 08:50 ] @
Prica je sledeca :

1.User kontrola ima objekat klase koji mi se puni podacima iz baze podataka. Instanca tog objekta se cuva u sesiji da ga ne bih punio svaki put kad dodje do postBack-a.
2.User kontrola ima i metodu koja , na osnovu tog objekta (sada u sesiji), generise HTML tabelu sa kontrolama. Ta HTML tabela se posle dodeljuje nekom Panelu.
3.Da bi server video serverske event-e koji su prouzrokovani dinamicki generisanim kontrolama(u tacki 2.) ja moram da pozovem metodu za generisanje HTML tabele svaki put kad dodje do PostBack-a.
Pozivao sam je na Load event user kontrole. Pokusao sam i druge varijante : Init,na page stranici ...

Taj HTML jednostavno mora da se dinamicki kreira zbog slozenosti i zavisnosti od baze.

[ mmix @ 09.06.2010. 09:12 ] @
Zbog ovog u tacki 2 ne mozes da dobijes realan ID. Sta vise imas konkretan rizik da vise elemenata ima isti ID sto ti iskljucuje mogucnost da jednoznacno lociras element.


Ja ti i dalje kazem da ti ovo radis previse komplikovano. Ti zaravo pravis paralelni asp.net sistem sa svojom strukturom kontrola, a bez potrebe.

Umesto sto radis ove stvari, zasto ne kesiras podatke i ne kreiras strukturu kontrola u initu? I ucemu je problem da inicijalizujes strukturu u postbacku, sta mislis sta rade kompleksne asp.net kontrole inace? I onda lepo pustis asp.net da ti renderuje taj segment zajedno sa ostatkom stranice i pusis asp.net da ti vodi racuna o clientID i post paketima
[ Zdravo_djaci @ 09.06.2010. 10:17 ] @
Hajde proanaliziracu jos malo i pokusacu da odradim sa kesiranjem pa cu javiti sta sam uradio.

Hvala na savetima i odgovorima.
[ pl4stik @ 09.06.2010. 12:02 ] @
Proveri ovde kako se html elementima prilazi sa serverske strane mozda ti se javi neko resenje.
[ Dejan Carić @ 19.07.2010. 15:11 ] @
U .NET 4.0 postoji property ClientIDMode koji na HTML stranici generiše čist ID.

Primer:
Code:
<asp:Image ID="cleanID" ClientIDMode="Static" runat="server" />

[ mmix @ 28.07.2010. 10:37 ] @
Uzas. Jos jedan moguci point of failure. I sta ako imas user kontrolu sa oim tagom i stavis dve kontrole na formu? Ovo je jedna od onih stvari zbog kojih se ljudi cesu po glavi kad nesto prestane da radi.
[ Dejan Carić @ 28.07.2010. 13:28 ] @
Citat:
mmix: I sta ako imas user kontrolu sa oim tagom i stavis dve kontrole na formu?

A zašto bi to radio? ID svake kontrole treba da je jedinstven.
[ mmix @ 28.07.2010. 13:35 ] @
Pa upravo to mozes da sje*es sa sa gornjim atributom, pravis client ID koji je fiksiran na nivou cele stranice (samim timce i biti isti u dve instance iste user kontrole), samim tim mu umanjujes sanse da bude jedinstven, i odjednom vise ne rade javascript rutine bazirane na getElementByID. Ako pustis asp.net-u da imenuje kontrole u skladu sa hijerarhijom onda ce svaki element i biti jedinstven, sasmim tim je ClientIDMode veoma kontraproduktivan i problematican.
[ Dejan Carić @ 28.07.2010. 13:57 ] @
Pa i praviš ga da bude fixan. Ne znam šta tu ima sporno...
Ako ćeš koristiti više instanci te kontrole na jednoj stranici, onda nećeš ni setovati id, nego ćeš setovati class, a onda pomoću selektora u jquery-u, šetajući se kroz hijerarhiju kontrola, selektovati instancu koja ti je potrebna.
[ mmix @ 28.07.2010. 14:18 ] @
Aman, ne shvatas o cemu pricam, ne pricam ja o tebi i sta bi ti uradio, ni sta bi ja uradio, vec sta ce sampioni da rade i kakve ce ovo probleme da napravi. Ovo je atribut koji ne donosi nista neophodno a uvodi nove probleme nudeci lenjima liniju manjeg otpora.
[ vujkev @ 28.07.2010. 17:40 ] @
Pa ako neko stavi i "Throw New exception" u Page.load sajt neće raditi. To ne znači da Microsoft treba da izbaci exception nego programer treba da zna gde šta da stavi i kako će to funkcionisati. Par puta bi mi bilo 10x lakše da stavim fiksan ID nego da se petljam sa dinamički generisanim tako da je ovo po meni super rešenje. Naravno neću stavljati fiksni ID gde god mi padne na pamet, nego samo gde to stvarno treba.
[ mmix @ 28.07.2010. 20:51 ] @
Dva ne mogu da se porede. Server side exception ce puci ceo sajt, ova zezancija sa fiksiranim IDevima moze veoma lako da se provuce kroz sve faze kodiranja i testiranja narocito ako se dinamicki ucitavaju user kontrole u stranicu ili se kroz divove ucitava parcijalni HTML iz drugih izvora, i tako bug stigne u produkciju gde nece raditi a nece ni puci korisniku jer po defaultu browseri ne dizu popupove sa upozorenjima za JS greske. Samo zato sto je lakse ne znaci da je bolje, nazalost ta dva koncepta se u poslednje vreme poistovecuju.
[ vujkev @ 28.07.2010. 21:14 ] @
Poenta nije da poredim greške, već da ukažem na to da nije na Microsoftu da uči ljude kako da prave programe, nego da im da alat za taj posao. U ovom slučaju dao je mogućnost da se definiše fiksni ID, pa kome treba nek koristi. Ukoliko neko podesi fiksni ID, pretpostavka je da ta osoba zna šta radi i da će se pobrinuti da to radi kako treba.
Po meni ovo je još jedna opcija više kao bilo koja druga opcija u frameworku. Ako neko ne zna da je koristi na pravi način nije u redu da kažu "Microsoft je zabrljao", nego nek nauči da radi svoj posao.
[ dejanet @ 28.07.2010. 21:31 ] @
Savetao bi u ovim i slicnim slucajevima(dinamicko kreiranje kontrola i/ili sadrzaja), da se ide iskljucivo na html form elemente i u kombinaciji sa par java script funkcija mogu da zavrse posao, ostalo su ćorava posla..
[ pl4stik @ 28.07.2010. 22:12 ] @
^ Za ovo treba da si majstor do jaja


Stvarno ume da bude nezgodna stvar sa tim dupliranjima id-a ali je resenje relativno prosto (vodish racuna sta kako imenujesh) u odnosu na dobitak koji se ostvaruje ...
Po meni super stvar (velikim slovima)