2010-08-25 4 views
6

Le code suivant ne fonctionne pas. Le balisage est dans un contrôle utilisateur et je suppose que c'est pourquoi ClientID renvoie le mauvais préfixe pour l'ID TextBox.ASP.Net: ID client n'est pas correct dans le code-behind d'un contrôle utilisateur

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)); 

Résultats dans le navigateur:

<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);" /> 

Comme vous pouvez le voir, le paramètre de l'appel JavaScript est DoctorsMainArea1_ctl00_txtName, mais l'ID réel de l'élément d'entrée est DoctorsMainArea1_ctl01_txtName.

Une idée pour résoudre ce problème? jQuery? Je ne suis pas tellement intéressé par une explication de ce qui se passe (peut-être qu'il y a un autre contrôle sur cette page qui interfère), mais une manière plus robuste de résoudre le problème.

+1

pourquoi avez-vous besoin d'utiliser document.getElementById lorsque son l'événement onclick pour le même contrôle que vous essayez de récupérer? Pouvez-vous pas utiliser « ce » (qui retournera la boîte d'entrée. Ensuite, vous wont besoin même d'essayer de travailler sur l'identité, et vous n'aurez pas besoin runat = « server ». – RPM1984

+0

Le gestionnaire onclick pour le bouton est assemblé côté serveur car j'ai besoin du code postal et d'autres paramètres que j'ai supprimés pour rendre le code plus facile à lire. – cdonner

+0

Modifiez-vous l'arborescence de contrôle après la lecture de ClientID? – sisve

Répondre

4

Vous devez essayer de déplacer le code qui ajoute l'attribut onclick au bouton dans l'événement PreRender (ou le remplacement OnPreRender) dans votre page ou votre contrôle utilisateur. Cela devrait probablement avoir le droit ClientID.

+0

Il était dans l'événement Page_Init. Nous l'avons déplacé dans l'événement de chargement de page et cela fonctionne très bien. – cdonner

0

Une solution rapide:

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

Cela se produit parce que vous avez un espace réservé contenu dans votre page quelque part.

+0

Rapide peut-être, mais pas très robuste :-) – cdonner

+0

Pas robuste, vous avez raison. Si vous utilisiez ASP.NET 4, vous bénéficieriez d'une meilleure prise en charge des ID client. Les choses ont changé pour mieux. Dieu merci! –

0

une autre solution: balise html:

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

code bind:

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

et vous pouvez obtenir la valeur

il suffit d'utiliser le contrôle html.

+0

ps: ne donnez pas le nom de répétition dans la page, il deviendra une chaîne comme "valeur1, valeur2" –

+0

Comme je l'ai dit, ceci est un contrôle utilisateur et votre solution ne fonctionne pas pour plusieurs instances du contrôle sur un page. Puisque dans ce cas il n'y en aura pas plus d'un, et si rien ne se passe mieux, je pourrai toujours utiliser votre suggestion (jusqu'à ce qu'elle casse la page la prochaine fois). Je crois toujours que cela peut être fait plus élégamment avec jQuery. – cdonner

5

Je ne sais pas quelle version asp.net vous utilisez, mais dans la version 4.0, vous pouvez déclarer tout contrôle à l'intérieur du serveur ClientIDMode = « statique » et il vous donnera l'identifiant exact dans le navigateur.

Exemple:

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

D'autres sont prévisibles, héritera et il peut être utilisé avec ClientIdRowsuffix.Can être utilisé au niveau de la page et même sur les pages maîtres et même dans le fichier web.config.

Exemple sur fichier web.config:

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

à tekpub, Craig visionnées bottier vidéo vous pouvez également en savoir plus à ce sujet sur le blog de Rick link text. C'est plutôt cool.

+0

Nous sommes sur le cadre 3.5 – cdonner

+0

Merci, cela a fonctionné pour moi sur 4.0 – Mhmd

Questions connexes