Laden...

control.ID, control.ClientID, control.Unique.ID = Alles dasselbe?

Erstellt von schuppsl vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.507 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren
control.ID, control.ClientID, control.Unique.ID = Alles dasselbe?

Hallöle.
Ja, ich habe den Blogpost von Peter Bucher zu diesem Thema mehrfach gelesen aber anscheinend nicht verstanden.

Folgendes:

Ich habe eine verschachtelte Masterpage.
Also eine Masterpage, welche die grundlegenden Layoutgeschichten festlegt und darunter eine die bestimmte Inhalte darstellt.
In dieser gibt es eine Funktion die in Page_Load aufgerufen wird und die dynamisch Controls erzeugt, welche dann einem Panel (in der 2. Masterpage) zugewiesen werden.

Diese Funktion ist in einem reinen Codefile.
Es werden also die Controls erzeugt und in derselben Funktion ne Menge Javascript, welches per

ScriptManager.RegisterStartupScript ausgegeben wird.
So weit so gut.

Nur sollen die Javascriptfunktionen natürlich auf einige Controls zugreifen,welche ich dynamisch erstellt habe.

Da alles in derselben Funktion erzeugt wird, dachte ich , mache ich es ganz schlau und ich kann im Javascript die Controls locker per control.ClientID ansprechen...
da dies ja anscheinend die eindeutige, geschachtelte ClientID sein soll.

Pustekuchen.

Die ID's der Controls sind immer diesselben. Nämlich so wie ich sie beim dynamischen erstellen zuweise.

Das bringt mir natürlich nichts und im Javascript gibts Massig Fehler, da die Control IDs durch die Verschachtelungen gänzlich anders heißen.

Ich kann mir vorstellen, daß es für das Vergeben der eindeutigen IDs im Page_load zu früh ist, da in PreRender ja noch weitere folgen können und deshalb an der Stelle noch keine eindeutigen IDs bestehen, sondern erst wenn die Seite komplett durchgelaufen ist.

Ist das so?
Aber wie kann ich dann im JavaScript die Controls ansprechen?

Es muss alles in der Funktion erzeugt werden, da diese dann in der Anwendung dynamisch zuweisbar sein wird.

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

die ClientID sollte eigentlich das richtige sein, und Page_Load ist auch nicht zu früh.
Allerdings kann die ClientID erst bestimmt werden, wenn das Element (und alle übergeordneten Elemente) in die Seite eingefügt ist (nach dem Aufruf von Controls.Add(...)).

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Hm, so ein Käse aber auch.
Die Controls adde ich schlußendlich natürlich erst nach der Rückkehr aus der Funktion zu der Seite.
Wenn ich dann da das Javascript reinhaue, dann habe ich keinen Zugriff mehr auf die Controls, da ich diese ja in der Funktion erstelle.

Oder muss ich dann wieder alles durchsuchen....?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Du könntest Dir die betroffenen Controls beim Erstellen in einer Liste merken, für den späteren Zugriff...

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Ja, aber genau so nen Hickhack wollte ich vermeiden, aber wenns nicht anders geht...
Danke trotzem!

5.941 Beiträge seit 2005
vor 13 Jahren

Salute schuppsl

Was genau hast du den am Artikel nicht verstanden?
Ich denke eher das dir der Realisierungsteil fehlt oder unvollständig erscheint.
Schau dir hierzu mal folgenden Post an, der mehrere Möglichkeiten enthält, um an die ID zu kommen:

Es gibt zwei wichtige Punkte:

  • Das Control muss in die Hierarchie eingehängt werden (Am besten im OnInit, spätestens in OnLoad). Dabei ist zu beachten, das man wirklich am Root hängt, sowas nützt also nix:

Control test = new Control();
Label label = new Label();

test.Controls.Add(label);

sondern erst, wenn man sich komplett an die Page dranhängt, oder an ein Control das schon an der Page hängt.


this.Page.Controls.Add(test);

  • Werden die IDs erst kurz vor PreRender erzeugt (wenn der obere Punkt passt), also erst von diesem Zeitpunkt an, ausgelesen und genutzt werden können.

HTH

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Salute schuppsl

Es gibt zwei wichtige Punkte:

  • Das Control muss in die Hierarchie eingehängt werden (Am besten im OnInit, spätestens in OnLoad). Dabei ist zu beachten, das man wirklich am Root hängt, sowas nützt also nix:
    ......

sondern erst, wenn man sich komplett an die Page dranhängt, oder an ein Control das schon an der Page hängt.

  
this.Page.Controls.Add(test);  
  

Gruss Peter

Ja, soweit klar und genau darin besteht mein Problem!
Ich rufe die Render Funktion(welche meine Controls erzeugt) im Page_Load auf und müsste dann also im Page_PreRender die Controls suchen und dann die ID auslesen.
Aber wie kann ich diese finden, wenn ich nicht mal die ID kenne?
Zwickmühle.
Dann muss ich mal Deinen Link lesen...

leslesles...

Ok, den Namespace "tools" habe ich im Codefile (reines codefile) schonmal nicht...also geht Ansatz 1 nicht.

5.941 Beiträge seit 2005
vor 13 Jahren

Hoi Schuppsl

Ja, soweit klar und genau darin besteht mein Problem!
Ich rufe die Render Funktion(welche meine Controls erzeugt) im Page_Load auf und müsste dann also im Page_PreRender die Controls suchen und dann die ID auslesen.
Aber wie kann ich diese finden, wenn ich nicht mal die ID kenne?
Zwickmühle.

Ich sehe dein Problem nicht wirklich.

Den Vorschlag von MarsStein ist kein Workaraound, sondern eine Lösung,
so wie ich das verstehe 😃

Ok, den Namespace "tools" habe ich im Codefile (reines codefile) schonmal nicht...also geht Ansatz 1 nicht.

Bitte ganz unten schauen, dort gibts das Beispielprojekt zum Download.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Hoi Schuppsl

Den Vorschlag von MarsStein ist kein Workaraound, sondern eine Lösung,
so wie ich das verstehe 😃

Gruss Peter

Ist es nicht, da ich zu keinem Zeitpunkt die genaue ID erfahre.
Weder beim Erstellen, noch nach dem kompletten Rendern der Seite.

Das mag ja sein, daß es bei einer normalen Anwendung funktioniert, aber wenn die Controls in einer Codedatei (nicht Codebehind!) gerendert werden entsteht die endgültige ID erst wenn diese im Baum eingehängt werden.

Mir bleibt nichts anderes übrig, als alle Controls zu durchsuchen und mit der mir vergebenen ID zu vergleichen, bzw. ob die gefundene ID die entsprechende Zeichenfolge enthält.

Schlecht, denn ich wollte das modular machen und mit dieser Funktion eine Javascript Funktion mitrendern, was aber auch nicht möglich ist, da ich ja wieder die exakten IDs nicht kenne...

Hoi Schuppsl

Ok, den Namespace "tools" habe ich im Codefile (reines codefile) schonmal nicht...also geht Ansatz 1 nicht.
Bitte ganz unten schauen, dort gibts das Beispielprojekt zum Download.

Gruss Peter
Wo ist das?

5.941 Beiträge seit 2005
vor 13 Jahren

Hoi schuppsl

Das Beispielprojekt:

Ich sehe dein Problem jetzt. Hört sich jetzt zu einfach an, aber du musst dich an den Lifecycle halten, anders gehts nur mit Krücken.

Und das geht auch in fast jedem Fall. Im schlechtesten Fall musst du halt deine komplette Reihenfolge ein bisschen auf den Kopf stellen.

Wenn du das nicht magst, oder es einfach nicht gehen will, machs einfacher.
Nutze die Lösung von Wilco (http://www.wilcob.com/Wilco/News/AspNetIDOverride.aspx).
Nur hat der liebe Wilco den Content von der Seite genommen und angekündigt, er stelle das Zeugs langsam dann wieder hoch, was aber noch nicht passiert ist.

Darum würde ich vorschlagen du suchst einfach mal nach "ASP.NET ID Override".

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Hoi schuppsl

Ich sehe dein Problem jetzt. Hört sich jetzt zu einfach an, aber du musst dich an den Lifecycle halten, anders gehts nur mit Krücken.

Darum würde ich vorschlagen du suchst einfach mal nach "ASP.NET ID Override".

Gruss Peter

Hallo Peter.
Ja das mit dem Lifecycle ist mir schon klar, nur versuche ich den mit besagten Krücken zu umgehen, was das Ganze sehr erschwert.

Dieser Lifecycle habe ich mir verinnerlicht und trotzdem bricht der mir so oft das Genick, weil ich es oft nicht Lifecycle-konform machen kann, und darum ständig nach anderen Lösungen suchen muss...

Danke mal wieder, werde mir dann die besagten Links mal genauer ansehen.
Grüße und gute Nacht

5.941 Beiträge seit 2005
vor 13 Jahren

Salute schuppsl

Schau dir mal ASP.NET MVC an 😃.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Diese Aussage tut mir ja schon gut:

Postbacks fand ich immer etwas arg umständlich und das Problem “dynamisch hinzugefügte Controls” ist und bleibt irgendwie nicht ganz einfach zu lösen.

...bei mir sind fast alle Controls dynamisch.

Aber das hört sich doch gut an:

ASP.NET MVC ist eine Alternative zu den Webforms, welche eine bessere Kontrolle über den gerenderten HTML Code ermöglicht und durch das MVC Modell besser aufgeteilt und auch testbarer wird

Aber das Projekt läuft und ich kann unmöglich von vorne beginnen.....

EDIT: wie es scheint, ist das mit dynamischen Controls mit MVC auch nicht besser(was ich jetzt gelesen habe), also kann ichs lassen...

EDIT:
Ich habs nun versucht im PreRender die Controls zu suchen. Sie werden gefunden, aber nicht mit der UniqueID, sondern mit der ID die ich vergebe.
Bringt das was wen nich daraus ein Usercontrol mache und die Funktionalität komplett kapsle?
Alternativ muss ich per Javascript auf der fertigen Seite die Controls suchen und so dann ansprechen..

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

@Peter

ES GEHT!!!!!!!

DANK Deinem Post und dem Beispielprojekt hats nun endlich funktioniert...

DANKE DANKE DANKE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
👍 👍 👍 👍 👍 👍 👍