<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.aspnetzone.de/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'ClientID' and 'JavaScript'</title><link>http://www.aspnetzone.de/search/SearchResults.aspx?o=DateDescending&amp;tag=ClientID,JavaScript&amp;orTags=0</link><description>Search results matching tags 'ClientID' and 'JavaScript'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61120.2)</generator><item><title>Artikel: Identifizierung von Controls: Control.ID / .ClientID / .UniqueID</title><link>http://www.aspnetzone.de/blogs/peterbucher/archive/2007/04/09/artikel-identifizierung-von-controls-control-id-clientid-uniqueid.aspx</link><pubDate>Mon, 09 Apr 2007 17:46:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:178458</guid><dc:creator>Peter Bucher</dc:creator><description>&lt;P&gt;ASP.NET Controls haben 3 verschiedene Eigenschaften, anhand dessen man sie identifizieren kann.&lt;BR&gt;Na gut, man mag denken, desto mehr, desto besser :))&lt;/P&gt;
&lt;P&gt;Es kann aber auch genau auch das Gegenteil bedeuten: Verwirrung.&lt;/P&gt;
&lt;P&gt;Um die "Bösewichte" mal beim Namen zu nennen:&lt;BR&gt;&lt;STRONG&gt;Serverseitige ID&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt; &amp;lt;Control&amp;gt;.&lt;STRONG&gt;ID&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;Clientseitige ID&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt; &amp;lt;Control&amp;gt;.&lt;STRONG&gt;ClientID&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;Clientseitiger Namen&lt;/STRONG&gt;&amp;nbsp; --&amp;gt; &amp;lt;Control&amp;gt;.&lt;STRONG&gt;UniqueID&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Ein kleiner Exkurs zu Classic ASP um mehr über die Hintergründe zu erfahren.&lt;BR&gt;In Classic ASP kann ein erweitertes HelloWorld Script so aussehen:&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV class=CodeBox&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;form&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;name&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="myForm"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;method&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="post"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;input&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;type&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="text"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;name&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="txtName"&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;input&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;type&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="submit"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;value&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="PostBack..."&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;name&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="btnSubmit"&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;form&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;If&lt;/span&gt; Request.Form.&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Count&lt;/span&gt; &amp;gt; 0 &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Then&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;If&lt;/span&gt; Request.Form(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"txtName"&lt;/span&gt;) &amp;lt;&amp;gt; vbNullString &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Then&lt;/span&gt;&lt;br /&gt;          Response.&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Write&lt;/span&gt;(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Hallo "&lt;/span&gt; &amp;amp; Request.Form(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"txtName"&lt;/span&gt;) &amp;amp; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"!"&lt;/span&gt;)&lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;If&lt;/span&gt;        &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;%&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Wir deklarieren hier alles von Hand und das genau so, wie es schliesslich beim Client ankommt.&lt;BR&gt;Es wird der Name "txtName" für das Html Input Field manuell gesetzt und schliesslich auch für das anschliessende Request.Form benutzt.&lt;BR&gt;Keine Probleme und eine heile Welt also :-)&lt;/P&gt;Nun, was ist den überhaupt in ASP.NET so anders, dass wir hier drei verschiedene Eigenschaften zur Identifizierung eines Controls brauchen, werdet ihr euch wahrscheinlich fragen.&lt;BR&gt;Es ist aber tatsächlich so, dass alle drei Eigenschaften ihre Berechtigung haben, hier also im einzeln:&lt;BR&gt;&lt;BR&gt;
&lt;H2&gt;&lt;FONT color=#808080&gt;Serverseitige ID --&amp;gt; &amp;lt;Control&amp;gt;.ID&lt;/FONT&gt;&lt;/H2&gt;Die serverseitige ID wird, wie der Name schon sagt, auf dem Server benutzt.&lt;BR&gt;
&lt;P&gt;Bei deklerativen oder per Code erstellten Controls / Steuerelementen vergibt man manuell oder per Code automatisiert eine ID.&lt;BR&gt;Diese dient bei der serverseitigen Arbeit zur eindeutigen Identifizierung der Controls.&lt;/P&gt;
&lt;P&gt;Beim arbeiten mit ASP.NET benutzt man die meiste Zeit diese ID.&lt;BR&gt;Wichtig zu wissen ist dabei, dass man durch die Schachtelung von Controls oder Schachtelung von Quellcode und Definierung von Namensräumen und Aliase, die jeweiligen IDs auch mehrmals vergeben kann, ohne dass dabei serverseitig die Eindeutigkeit verloren geht.&lt;/P&gt;
&lt;P&gt;Schlussendlich wird die ganze Eindeutigkeit eben durch die Möglichkeiten auf dem Server (Schachtelung, Namensräume, Aliase) konsistent gehalten, ohne dass dabei Probleme entstehen.&lt;/P&gt;
&lt;H2&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;Clientseitige ID --&amp;gt; &amp;lt;Control&amp;gt;.ClientID&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;Jetzt kommt die Kehrtwende, wir arbeiten ja nicht ausschliesslich auf dem Server, sondern wollen uns auch die Möglichkeiten auf dem Client nicht entgehen lassen.&lt;BR&gt;Auf dem Client können wir mit Javascript oder VBScript (nur Internet Explorer) weiterarbeiten, ohne auf Rücksprache mit dem Server angewiesen zu sein.&lt;BR&gt;&lt;BR&gt;Um überhaupt mit Javascript arbeiten zu können, müssen wir serverseitig den entsprechenden Code konstruieren und dem Client im Ausgabestrom zur Verfügung stellen.&lt;/P&gt;
&lt;P&gt;Jetzt sieht die Situation mit den IDs schon wieder ganz anders aus.&lt;BR&gt;Auf dem Client wird eine Html Seite (und evt. weitere Elemente) empfangen und verarbeitet. Im Gegensatz zum Server, haben wir hier keine Möglichkeiten mehr, von den oben genannten Vorteilen (Schachtelung, Namensräume, Aliase) zu profitieren.&lt;/P&gt;
&lt;P&gt;ASP.NET wirkt diesem Problem entgegen, indem es, &lt;STRONG&gt;* bei&amp;nbsp;Bedarf&lt;/STRONG&gt;,&amp;nbsp;für den Client aus den auf dem Server eindeutigen Namen / IDs, jeweils eindeutige Namen und IDs für den Client generiert.&lt;BR&gt;So haben wir auf dem Server und auf dem Client jeweils eine eindeutige Namensumgebung ohne Konflikte.&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;*&lt;/STRONG&gt; Wenn ein Control z.B.&amp;nbsp;nur an die Page selber gehängt wird, kommen keine Präfixe&amp;nbsp;in die ClientID bzw. UniqueID bzw. vor die normale ID.&lt;/P&gt;
&lt;P&gt;Wollen wir jetzt clientseitig mit Javascript weiterarbeiten, kommt serverseitig zuerst &amp;lt;Control&amp;gt;.ClientID ins Spiel, diese Eigenschaft enthält die ID, die von ASP.NET automatisch generiert und zum Client gesendet wird.&lt;BR&gt;Wir übergeben dem Javascript Code, der dann schlussendlich vom Server zum Client geschickt wird, jeweils die ClientID, die ASP.NET auch in den Html Quellcode rendert.&lt;BR&gt;So können wir per Javascript auf die jeweiligen Controls clientseitig zugreifen.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Die clientseitige ID setzt sich aus dem Container- und dem eigentlichen Namen zusammen.&lt;BR&gt;Beispielsweise ist in einem UserControl "uc1" ein Label "lblTest" enthalten, so lautet die ClientID: &lt;B&gt;uc1_lblTest&lt;/B&gt;&lt;BR&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color=#808080&gt;Clientseitiger Namen --&amp;gt; &amp;lt;Control&amp;gt;.UniqueID&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;Am oberen Classic ASP Beispiel sehen wir, dass für die Übermittlung von Formularen mittels POST, das Name-Attribut eines Html Input Fields zur Identifizierung benutzt wird.&lt;BR&gt;Die UniqueID ist im Grunde dasselbe wie die ClientID, nur dass man sich hier auf den Namen bzw. das Name-Attribut des Elementes bezieht und der Name anders codiert wird.&lt;BR&gt;&lt;BR&gt;Die Zusammensetzung der ID ist identisch mit dem oberen Beispiel, nur dass zur Trennung der Namen, jeweils ein Dollarzeichen benutzt wird. UniqueID wird z.B. für den Fall benutzt, wenn man per Request.Form[] manuell einen Wert abrufen möchte.&lt;BR&gt;Das Name-Attribut wird auf dem Client also wie folgt lauten: &lt;B&gt;uc1$lblTest&lt;/B&gt;&lt;BR&gt;&lt;/P&gt;
&lt;H2&gt;&lt;FONT color=#808080&gt;Beispiel und Demonstration von Problemen die auftreten könnten&lt;/FONT&gt;&lt;/H2&gt;Ich habe für euch ein Beispiel zusammengestellt, das sowohl die Nutzung von serverseitigen IDs und UniqueID demonstriert, als auch&amp;nbsp; im gleichen Atemzug auch ein mögliches Problem aufzeigt.&lt;BR&gt;&lt;BR&gt;Im Beispiel verwende ich eine normale ASPX Seite mit Codebehind so wie auch ein UserControl das im Prinzip gleich aufgebaut ist, wie die ASPX Seite.&lt;BR&gt;Die ASPX Seite bindet im unteren Bereich das UserControl ein.&lt;BR&gt;Nicht nur der deklerative Teil, sondern auch der codierte, sieht praktisch gleich aus.&lt;BR&gt;Auch die Benennung in Form von serverseitigen IDs ist zu Demonstrationszwecken völlig identisch.&lt;BR&gt;&lt;BR&gt;Das Beispiel ist im Grunde gleich aufgebaut, wie das obere Classic ASP Beispiel.&lt;BR&gt;Wir haben ein Formular, eine TextBox und ein Submit Button. Desweiteren sind auch noch ein paar Statuslabels vorhanden.&lt;BR&gt;&lt;A href="http://www.aspnetzone.de/photos/peterbucher/images/178462/original.aspx"&gt;&lt;IMG src="http://www.aspnetzone.de/photos/peterbucher/images/178462/343x480.aspx" align=right border=0&gt;&lt;/A&gt;&lt;BR&gt;Man gibt seinen Namen ein und erhält ihn dann inklusive einer Begrüssung angezeigt, im UserControl, sowie auch auf der Seite.&lt;BR&gt;Wenn man das Beispiel ausführt und bei beiden TextBoxen jeweils einen Wert eingibt, fällt gleich auf, dass bei der Ausgabe vom UserControl bei der Abfrage per Request.Form auf die &amp;lt;Control&amp;gt;.ID, den Wert vom Formular der ASPX Seite selber, angezeigt wird.&lt;BR&gt;&lt;BR&gt;Der Grund ist einfach, wir haben serverseitig in der ASPX Seite, sowohl auch im UserControl identische Bezeichner, für unserer TextBoxen (und den ganzen Rest), wenn wir jetzt also versuchen clientseitig mithilfe der &amp;lt;Control&amp;gt;.ID auf den Wert zuzugreifen, fallen wir hier in einen Namenskonflikt.&lt;BR&gt;&lt;BR&gt;Die Request.Form[] Abfrage per &amp;lt;Control&amp;gt;.ClientID bringt uns auch nicht weiter, &lt;B&gt;da bei der Übertragung per POST auf die Namen zurückgegriffen wird und nicht auf die ID!&lt;/B&gt;&lt;BR&gt;&lt;BR&gt;Hier ist &amp;lt;Control&amp;gt;.UniqueID also die Qual der Wahl, denn diese Eigenschaft liefert uns das automatisch generierte Name-Attribut des Controls.&lt;BR&gt;&lt;BR&gt;
&lt;H2&gt;&lt;FONT color=#808080&gt;Abschliessende Worte&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;Im Grunde benötigt man bei der Arbeit mit ASP.NET meistens nur ID oder die ClientID.&lt;BR&gt;Request.Form sowie auch Response.Write sollte und benötigt man praktisch nicht mehr.&lt;BR&gt;&lt;BR&gt;Das Modell von ASP.NET bietet hier viel komfortablere Möglichkeiten, anstelle von Response.Write() bieten sich Controls / Steuerelemente an, die man dynamisch per Inhalt füllen kann, z.B. &amp;lt;Control&amp;gt;.Text, etc..&lt;BR&gt;&lt;BR&gt;Anstelle von Request.Form[] kann man im Code einfach auf die .Text Eigenschaft der TextBoxen zugreifen.&lt;BR&gt;So wird die ganze Arbeit mit der Identifizierung der Controls von ASP.NET gehandelt und vereinfacht.&lt;BR&gt;&lt;STRONG&gt;Siehe auch:&lt;/STRONG&gt; &lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2008/02/04/die-alten-bekannten-response-write-und-request-form.aspx"&gt;Die alten Bekannten - Response.Write() und Request.Form[]&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Möglichkeiten um Javascript die ClientID eines Controls bekanntzumachen, finden sich auf folgender Seite:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2008/09/02/zwei-ans-tze-wie-mit-den-clientids-von-asp-net-umgegangen-werden-kann.aspx"&gt;Zwei Ansätze wie mit den ClientIDs von ASP.NET umgegangen werden kann&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Beispielprojekt:&lt;BR&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.aspnetzone.de/files/folders/178463/download.aspx"&gt;UserControlTest.zip&lt;/A&gt;&lt;BR&gt;&lt;/LI&gt;&lt;/UL&gt;MSDN Links:&lt;BR&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/de-de/library/system.web.ui.control.id%28VS.80%29.aspx"&gt;System.Web.UI.Control.ID&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/de-de/library/system.web.ui.control.clientid%28vs.80%29.aspx"&gt;System.Web.UI.Control.ClientID&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/de-de/library/system.web.ui.control.uniqueid%28vs.80%29.aspx"&gt;System.Web.UI.Control.UniqueID&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Dank geht an &lt;A href="http://blog.veloursnebel.de/"&gt;Kai Gloth&lt;/A&gt; für die Idee zum Artikel, sowie den Hinweis zu &amp;lt;Control&amp;gt;.UniqueID im Bezug auf Request.Form[]&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;Bearbeitung / Korrekturen&lt;/STRONG&gt;:&lt;BR&gt;23.05.07 - Hinweis zum generieren bzw. nichtgenerieren&amp;nbsp;der&amp;nbsp;IDs hinzugefügt&lt;BR&gt;28.11.07 - Link zum Codeclip von Daniel Walzenbach hinzugefügt&lt;BR&gt;17.03.08 - Link zu "&lt;A href="http://www.aspnetzone.de/blogs/peterbucher/archive/2008/02/04/die-alten-bekannten-response-write-und-request-form.aspx"&gt;Die alten Bekannten - Response.Write() und Request.Form[]&lt;/A&gt;" hinzugefügt&lt;/P&gt;</description></item></channel></rss>