2010-01-22 4 views
0

Je rencontre un problème avec <% = obj.ClientID%> expansion, dans un contrôle utilisateur .ascx.Expansion de ClientID dans une chaîne d'événement

Je dispose d'un fichier .js, contenant une fonction javascript:

function doSomething(objectId) 
{ 
    ... 
} 

J'ai un fichier .ascx, avec quelques éléments html, et un élément de la onclick = Je veux appeler doSomething(), en passant l'ID d'un élément dans ce fichier .ascx, où l'identifiant transmis est d'un élément autre que celui sur lequel on clique, donc je ne peux pas utiliser "this".

Peut-être que ce serait plus clair avec un exemple.

Cela fonctionne:

<script type="text/javascript"> 
    function redirect() 
    { 
     doSomething('<%= top.ClientID %>'); 
    } 
</script> 
<div id="top" runat="server"> 
    <img src="..." alt="..." onclick="redirect();"/> 
</div> 

Mais cela ne:

<div id="top" runat="server"> 
    <img src="..." alt="..." onclick="doSomething('<%= top.ClientID %>');"/> 
</div> 

Quand je regarde la source, je vois que la <% =%> substitution n'a pas eu lieu, au lieu de " faire quelque chose ('ctl00_myControl_top'); " Je reçois "doSomething ('<% = top.ClientID%>');"

Pour une raison quelconque, l'expansion du script se produit dans le premier cas, mais pas dans le second. La solution de contournement, bien sûr, n'est pas acceptable car elle sera interrompue si j'inclue plusieurs copies du contrôle sur une page - seule la fonction "redirect()" d'une instance sera accessible.

Des idées sur comment faire ce remplacement de travail?

+0

Vous avez la div à l'intérieur d'un tag de formulaire qui est runat = 'server' right? –

+0

Le contrôle serveur entier est inclus dans une balise de formulaire avec les sections runat = "server", div et script à la fois. –

Répondre

2

Fonctionne sur ma machine?

<div id="top" runat="server"> 
    <a href="#" onclick="doSomething('<%= top.ClientID %>')">rarrarara</a> 
</div> 

Devient

<div id="ctl00_ContentPlaceHolder1_top"> 
    <a href="#" onclick="doSomething('ctl00_ContentPlaceHolder1_top')">rarrarara</a> 
</div> 
+0

Même ici, fonctionne aussi sur ma machine – Jakkwylde

+0

Je m'y attendais, sur ma machine, c'est pourquoi j'étais si surpris quand ça ne l'était pas. Je pensais avoir vérifié toutes les erreurs ridiculement évidentes, peut-être que je ne l'ai pas fait. –

+0

Essayer d'ajouter un ID et un runat = "server" à votre ancre. Il semble que si j'ai une balise runat = "server" sur l'élément qui a l'événement onclick, l'expansion <% %> ne se produit pas. –

0

Tenir compte un autre itinéraire:

Assurez-vous que le contrôle que vous référencez en JavaScript en utilisant l'expression en ligne <%= (controlName).ClientID %> a son spécificateur 'ClientIDMode' set à une statique valeur, puis utilisez simplement le texte dans le champ ID de ce contrôle pour y faire référence. J'ai fini par l'utiliser dans un projet récent, ça fonctionne très bien. S'il vous plaît voir le lien ci-dessous pour une explication plus détaillée:

Code Project - ASP.NET v4.0 Client ID Feature

Avec le réglage de la « ClientIDMode » spécificateur à « statique », j'ai trouvé une idée utile en ce qui concerne le texte plaçant à partir d'un fichier de ressources globales (dans le cas de changement de langue) dans un champ d'un contrôle HTML standard qui ne doit pas s'exécuter au niveau du serveur. J'ai utilisé ceci sur un bouton HTML standard qui était censé appeler une fonction JavaScript qui montrerait/cacherait un div spécifique ou un panneau ASP. Utilisez la fonction GlobalResource dans les balises d'expression inline comme ceci:

<input id="btnToggleFilterOptions" type="button" value="<%=GetGlobalResourceObject("SiteResource", "btnToggleFilterOption")%>" onclick="javascript:ToggleCssClass('divFilterOption','visible'); return false;" class="button submit" /> 

<asp:Panel ID="divFilterOption" ClientIDMode="Static" runat="server"> 
    <asp:TextBox ID="txtFilterOption1" runat="server" /> 
</asp:Panel> 

Je sais que c'est un ancien poste, mais il est un succès populaire lors de la recherche sur Google pour Asp .NET et ClientID. J'espère que cela aide quelqu'un d'autre!