2010-08-25 8 views
6

Der folgende Code funktioniert nicht. Das Markup befindet sich in einem Benutzersteuerelement, und deshalb gibt ClientID das falsche Präfix für die TextBox-ID zurück.ASP.Net: ClientID in Code-Behind eines Benutzersteuerelements nicht korrigiert

Markup:

<INPUT id="txtName" runat="server" maxlength="50" style="WIDTH:100px"> 
<INPUT type="button" value="Find Your Doctor" id="btnFind" runat="server" 
     style="MARGIN-LEFT:10px;WIDTH:130px"> 

-Code-Behind:

btnFind.Attributes.Add("onClick",string.Format("DoctorLink 
     ('{0}',document.getElementById('{1}').value,{2});", 
     row["ZipCode"], 
     txtName.ClientID)); 

Ergebnisse in Browser:

<input name="DoctorsMainArea1$ctl01$txtName" type="text" 
    id="DoctorsMainArea1_ctl01_txtName" maxlength="50" style="WIDTH:100px" /> 

<input name="DoctorsMainArea1$ctl01$btnFind" type="button" 
    id="DoctorsMainArea1_ctl01_btnFind" value="Find Your Doctor" style="MARGIN- 
    LEFT:10px;WIDTH:130px" onClick="PrepareDoctorLink('90210', 
    document.getElementById('DoctorsMainArea1_ctl00_txtName').value);" /> 

Wie Sie sehen können, ist der Parameter für den Aufruf JavaScript ist DoctorsMainArea1_ctl00_txtName, aber Die tatsächliche ID des Eingabeelements ist DoctorsMainArea1_ctl01_txtName.

Irgendeine Idee, wie man das repariert? jQuery? Ich interessiere mich nicht so sehr für eine Erklärung dessen, was vor sich geht (vielleicht gibt es eine andere Kontrolle auf dieser Seite, die sich einmischt), aber eine robustere Art, das Problem zu lösen.

+1

Warum müssen Sie document.getElementById verwenden, wenn es das Ereignis onclick für dasselbe Steuerelement ist, das Sie abrufen möchten? Kannst du nicht einfach "this" verwenden (was das Eingabefeld zurückgibt. Dann musst du nicht einmal versuchen, die ID auszuarbeiten, und du brauchst runat = "server" nicht. – RPM1984

+0

Der Onclick-Handler für die Schaltfläche wird serverseitig zusammengefügt, da ich die Postleitzahl und andere Parameter brauche, die ich entfernt habe, um den Code leichter lesbar zu machen. – cdonner

+0

Ändern Sie den Kontrollbaum nach dem Lesen von ClientID? – sisve

Antwort

4

Sie sollten versuchen, den Code, der das onclick-Attribut hinzufügt, auf die Schaltfläche im Ereignis PreRender (oder OnPreRender override) auf Ihrer Seite oder Benutzersteuerung zu verschieben. Das sollte wahrscheinlich die ClientID richtig machen.

+0

gearbeitet Es war in der PageInit-Ereignis. Wir haben es in das Seitenladeereignis verschoben und es funktioniert einwandfrei. – cdonner

0

Eine schnelle Lösung:

btnFind.Attributes.Add("onClick",string.Format("DoctorLink 
     ('{0}',document.getElementById('{1}').value,{2});", 
     row["ZipCode"], 
     "DoctorsMainArea1_ctl01_" + txtName.ClientID)); 

Dies geschieht, weil Sie einen Inhalt Platzhalter in Ihrer Seite irgendwo haben.

+0

Schnell vielleicht, aber nicht sehr robust :-) – cdonner

+0

Nicht robust, du hast Recht. Wenn Sie ASP.NET 4 verwenden, haben Sie eine bessere Unterstützung für Client-IDs. Die Dinge haben sich verbessert. Gott sei Dank! –

0

eine andere Lösung: HTML-Tag:

<input type="text" name="txtName" id="txtName" /> 

Code-bind:

string txtName_value = Request.Forms["txtName"]; 

und Sie können den Wert

nur die HTML-Steuerung verwenden zu bekommen.

+0

ps: geben Sie nicht den Wiederholungsnamen auf der Seite, wird es eine Zeichenfolge, die wie "value1, value2" –

+0

Wie gesagt, dies ist ein Benutzersteuerelement und Ihre Lösung funktioniert nicht für mehrere Instanzen des Steuerelements auf einem Seite. Da es in diesem Fall nicht mehr als eins geben wird und wenn nichts Besseres auftaucht, kann ich Ihren Vorschlag immer noch verwenden (bis er das nächste Mal die Seite durchbricht). Ich glaube immer noch, dass dies mit jQuery eleganter gemacht werden kann. – cdonner

5

Ich weiß nicht, welche asp.net-Version Sie verwenden, aber in 4.0 können Sie in jedem Server-Steuerelement ClientIDMode = "statisch" deklarieren und es wird Ihnen die genaue ID im Browser geben.

Beispiel:

<asp:Textbox id="txtName" runat="server" ClientIdMode="static"/> 

Andere sind vorhersehbar, erben und es kann mit verwendet werden ClientIdRowsuffix.Can auf Seitenebene verwendet werden, und auch auf Musterseiten und sogar in web.config-Datei.

Beispiel auf Datei web.config:

<system.web> 
<Pages clientIDMode="predictable"/> 
other system web properties 
</system.web> 

Gesehen Craig Schuster Video bei tekpub, können Sie auch weitere Informationen zu Rick Blog link text lesen. Es ist ziemlich cool, tho.

+0

Wir sind auf dem 3.5 Framework – cdonner

+0

Danke, das hat für mich auf 4.0 – Mhmd

Verwandte Themen