Obtener clientid en el control del usuario desde un file javascript externo

Estoy desarrollando un control de usuario (ascx) en ASP.NET que usa javascript para manipular controles. Actualmente el código javascript está en línea y usa <%= somecontrol.ClientID %> para get el control que necesita.

Quiero poner el file javascript en un file externo pero desde un file externo no puedo usar la syntax anterior para recuperar los controles. He leído acerca de posibles soluciones en esta y en esta respuesta, pero el problema es que el control del usuario se puede colocar varias veces en la página. Esto significa que la matriz de Controles (mencionada en las respuestas) se representará varias veces con diferentes elementos. Como resultado, el script no podrá recuperar el ID que necesita. Si pongo <%= ClientId %> en el nombre de la matriz que contiene elementos, entonces tendré el mismo problema que estoy tratando de resolver.

¿Algunas ideas?

Bien, un enfoque diferente, que trato de usar un estilo de class JavaScript, y luego inicializarlo para cada control.

En el file javascript externo, escriba su código como:

 function oNameCls(ControlId1) { this.ControlId1 = ControlId1; this.DoYourWork1 = function() { // use the control id. // this.ControlId1 } this.DoYourWork2 = function() { // use the control id. // this.ControlId1 } } 

Y en el control, hazlo así.

 <script language="Javascript" type="text/javascript"> // init - create var <%=this.ClientID%>MyCls = new oNameCls(<%=Control1.ClientID%>); // do your work <%=this.ClientID%>MyCls.DoYourWork1(); </script> 

Espero que ahora ayudes mejor.

La forma en que resuelvo este problema es usar classs de CSS o colocar los controles dentro de contenedores con identificaciones conocidas y luego recorrer los elementos secundarios del contenedor para get los controles reales. Por ejemplo:

 <asp:TextBox ID="Something" runat="server" CssClass="mycontrol" ... /> 

Se puede acceder a través de:

 jQuery('.mycontrol'); 

O:

 <div id="ControlContainer"> <asp:TextBox ID="Something" runat="server" ... /> </div> 

Se puede acceder a través de:

 jQuery("#ControlContainer input[type='text']"); 

El único problema real con este enfoque es que estás atando tu código a un marcado específico en la página, lo que puede ser una molestia si el marcado cambia mucho.

¿Qué pasa con una variable oculta?

 <input type="hidden" id="ClientId" value="<%=ClientId %>"> 

Entonces desde tu js:

 $("#" + $("#ClientID").val()) 

O bien, ponga el hash en:

 <input type="hidden" id="ClientId" value="#<%=ClientId %>"> ... $($("#ClientID").val()) 

Si desea encontrar un control específico cuando podría haber múltiples copys, esto no se puede hacer. ¿Cómo sabría el javascript externo cuál de los n controles quería?

Cómo puede upload el comportamiento a una class y encontrar los elementos relativos a la position del control de acción, como este:

Control de usuario:

 <div class="myControl"> <asp:Button id="MyButton" runat="server" Text="Click Me" /> <div style="display:none;">Show me!</div> </div> 

Si jQuery fue escrito para ser relativo de esta manera:

 $(".myControl input").click(function() { $(this).next().slideDown(); }); 

En este caso, no importa cuáles sean los ID específicos, siempre que pueda navegar el DOM con relación a los controles que necesita. Incluso si es más complejo como .closest("div").next().find(".bob").prev() … lo que sea que necesites para llegar funciona.