6
votes

ASP.NET: ClientId pas correct dans le code-code d'un contrôle de l'utilisateur

Le code suivant ne fonctionne pas. Le balisage est dans un contrôle de l'utilisateur et je suppose que c'est pourquoi ClientID renvoie le mauvais préfixe de l'ID de Textbox.

Marchup: P>

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


4 commentaires

Pourquoi avez-vous besoin d'utiliser document.getElementByID lors de son événement OnClick pour le même contrôle que vous essayez de récupérer? Pouvez-vous simplement utiliser "ceci" (qui retournera la boîte d'entrée. Ensuite, vous n'aurez peut-être même pas besoin d'essayer d'essayer d'essayer l'identifiant et que vous n'aurez pas besoin de runat = "serveur".


Le gestionnaire ONCLICK pour le bouton est mis ensemble 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.


Changez-vous l'arbre de contrôle après lire clientId?


Peut-être. Le clientIide est lu dans l'événement Page_Init (). Il y a tellement de choses sur cette application que je ne peux pas répondre à la question avec certitude.


4 Réponses :


0
votes

une solution rapide:

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


2 commentaires

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


Pas robuste, tu as raison. Si vous utilisiez ASP.NET 4, vous auriez un meilleur support pour les identifiants clients. Les choses ont changé pour mieux. Dieu merci!



0
votes

Une autre solution: TAG HTML:

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


2 commentaires

PS: Ne donnez pas le nom de répétition dans la page, il deviendra une chaîne qui aime "valeur1, valeur2"


Comme je l'ai dit, il s'agit d'un contrôle de l'utilisateur et votre solution ne fonctionne pas pour plusieurs instances de la commande sur une page. Puisque dans ce cas, il n'y aura pas plus d'un, et si rien ne vaut mieux se lever, je peux toujours utiliser votre suggestion (jusqu'à ce qu'il casse la page la prochaine fois). Je crois toujours que cela peut être fait plus élégamment avec jQuery.



5
votes

Je ne sais pas quelle version asp.net que vous utilisez mais dans la version 4.0, vous pouvez déclarer à l'intérieur de n'importe quel client de serveur ClientIdMode = "statique" et il vous donnera l'identifiant exact dans le navigateur.

Exemple: P> Exemple: P> >

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


0 commentaires

4
votes

Vous devriez essayer de déplacer le code qui ajoute l'attribut OnClick sur le bouton de l'événement PRERender (ou ONPRender Remplacer) dans votre page ou votre contrôle utilisateur. Cela devrait probablement obtenir le droit de la cliente.


1 commentaires

C'était dans l'événement de page_Init. Nous l'avons déplacé dans l'événement de la page et cela fonctionne bien.