2011-06-30 5 views
2

J'ai créé une liste déroulante dans mon contrôle utilisateur, voir le code source ci-dessous,Référencer le contrôle Web ASP.NET en javascript

<asp:DropDownList ID="ddlInd" runat="server" DataSourceID="indXmlDS" DataTextField="text" DataValueField="text"></asp:DropDownList> 

Dans Page_load Je l'ai fait:

protected void Page_Load(object sender, EventArgs e) 
    { 
     ClientScriptManager cs = Page.ClientScript; 
     cs.RegisterStartupScript(this.GetType(), "myScript", "<script language='javascript' src='../Scripts/myJS.js'></script>"); 
     ddlInd.Attributes["onchange"] = "showTextbox()"; 
    } 

Alors quel code devrais-je utiliser, si je voudrais me référer à ce contrôle dans mon fichier javascript externe, myJS.js?

J'ai essayé d'utiliser document.getElementById("<%=ddlInd.ClientID %>") mais il retournera NULL.

Quelqu'un peut-il aider? Merci

EDIT:

Je ne sais pas si ce fichier myJS.js attache serait utile ici

function showTextbox() { 
    var sid = <%=ddlInd.ClientID %>; 
    //alert(sid); 
    var s = document.getElementById('<%=ddlInd.ClientID %>'); // <-- problem here 

    alert(s); 
    if (s.options[s.selectedIndex].value == "Other") { 
     myDiv.style.display = "inline"; 
     alert("display"); 
    } 
    else { 
     myDiv.style.display = "none"; 
     alert("none"); 
    } 
} 

EDIT2:

Je trouve un peu la solution de contournement qui consiste à intégrer des scripts dans l'utilisateur page de contrôle au lieu d'utiliser un fichier de script externe. Merci à tous pour les suggestions. Ils étaient tous très utiles.

également le script js modifié est comme suit, et cela fonctionne:

function showTextbox(objID) { 
    var s = document.getElementById(objID); 
    var div = document.getElementById("myDiv"); 
    if (s.options[s.selectedIndex].value == "Other") { 
     div.style.display = "inline"; 
    } 
    else { 
     div.style.display = "none"; 
    } 
} 
+0

ddlInd.ClientID retourne-t-il la valeur null ou getElementById? –

+0

@paolo Je pense que son document.getElementByID qui renvoie NULL – woodykiddy

+0

Où et comment avez-vous essayé 'document.getElementById (" <% = ddlInd.ClientID%> ")', comme paramètre pour 'showTextbox'? Il pourrait également être utile de voir la partie pertinente de votre Usercontrol où 'ddlInd' et le TextBox sont. Est-ce que 'showTextbox' n'a pas besoin de l'ID de TextBox? –

Répondre

1

Essayez d'utiliser ClientScriptManager.RegisterClientScriptInclude au lieu de RegisterStartupScript.

Il semble que dans votre cas, vous incluiez un fichier javascript externe, plutôt qu'un code javascript qui devrait apparaître directement dans la page.

Essayez également de changer les guillemets doubles "à guillemets simples 'dans document.getElementById('<%=ddlInd.ClientID %>')

EDIT oh, je vois que vous essayez de faire <% = ddlIndustry.ClientID%> dans votre fichier javascript. C'est ne va pas être interprété dans un fichier js externe!Vous devez inclure votre fonction directement dans la page (pas en tant que fichier externe) ou essayer de transmettre le ColntrolId en tant qu'argument à la fonction js

+0

Son en me donnant ** showTextbox n'est pas défini ** erreur: ( – woodykiddy

+0

cela semble être une erreur de javascript, maintenant. le chemin vers votre fichier javascript est correct Vous devriez essayer "~/Scripts/myJS.js" comme chemin d'accès à votre fichier js.Un chemin relatif à votre js est difficile à l'intérieur d'un contrôle utilisateur, car le chemin vers le js est relatif à la page où y Vous incluez le contrôle, pas le contrôle utilisateur lui-même. –

+0

Ne fonctionnait pas non plus. Même erreur que ci-dessus :( – woodykiddy

0

Essayez de régler le ClientIDMode du contrôle à Prévisible:

<asp:DropDownList ID="ddlInd" ClientIDMode="Predictable" runat="server" DataSourceID="indXmlDS" DataTextField="text" DataValueField="text"></asp:DropDownList> 

Vous pouvez également utiliser un ClientId statique en utilisant ClientIDMode="Static" auquel cas le ClientId sera égal à l'identifiant du contrôle, donc vous pouvez dire:

document.getElementById("ddlInd"); 
+0

Pas de chance. me donnant toujours NULL, quand j'appelle 'alert (document.getElementById (" <% = ddlInd.ClientID%> "))' – woodykiddy

+0

@woodykiddy: et quand vous appelez: alert ("<% = ddlInd.ClientID%>") ? –

+0

Pas de chance là non plus quand 'ClientIDMode =" Statique "' Je ne sais pas quel est le problème avec mon code :( – woodykiddy

0

vous pouvez utiliser pour référencer votre contrôle pour .js fichier

$ ('# select ddlInd'). Val (....)

si le dropdownlist se trouve dans un "ContentPlaceHolder", vous pourriez faire

$ ('# select ContentPlaceholderID_ddlInd') val (...)

placer dans votre fichier .js

note:. inclure bien sûr votre fichier .js

+0

Cela supposerait que l'OP a accès à jQuery, évidemment –

0

Si vous ne pouvez pas utiliser .NET 4.0 et êtes bloqués sur 3.5/2.0 , J'ai écrit une petite bibliothèque appelée Awesome.ClientID pour résoudre ce problème.

Je l'ai posté avant dans cette réponse: How do I make this getElementsbyName work for IE (and FF)?

Fondamentalement, il vous permettra de sérialiser toutes vos commandes à un tableau JSON, et vous pouvez changer votre javascript:

document.getElementById(controls.ddlInd); 

Le bibliothèque se trouve ici: http://awesomeclientid.codeplex.com/

Blog post à ce sujet: http://www.philliphaydon.com/2010/12/i-love-clean-client-ids-especially-with-net-2-0/

0

Vous pouvez utiliser <% = Control.ClientID%> Lorsque vous avez un script sur la page .aspx si vous utilisez un fichier externe, alors vous devez utiliser l'ID de contrôle <% = ddlInd.ClientID%> ne fonctionnera pas.

Questions connexes