Leyendo Encosia explican como se debería hacer nuestras referencias a objetos de servidor desde Javascript.

Los controles ASP.NET cuando se renderizan para el cliente, el id de los mismos es diferente al id que podemos ver en el code-behind del ASPX

Un pequeño ejemplo:
<asp:Wizard runat="server" ID="Wizard1">
  <WizardSteps>
    <asp:WizardStep>
      <asp:TextBox runat="server" id="TextBox1" />
    </asp:WizardStep>
    <asp:WizardStep>
      <asp:Button runat="server" ID="Button1" />
    </asp:WizardStep>
  </WizardSteps>
</asp:Wizard>
Aquí TextBox1 y Button1 son accesibles desde code-behind, pero no es asi desde el lado del cliente, este ID cambia y se llamaran Wizard1_TextBox1 y Wizard1_Button1 respectivamente.

Una solución que muchos la usamos es hardcodear este id desde javascript y asi podemos tener acceso al control, pero esto esta muy mal dado que si algo cambia en el control ya dejara de funcionar, por ejemplo, si cambiamos el nombre del objeto contenedor inexorablemente cambiara el nombre del objeto que será visto desde el cliente.

Solución correcta:

Para realizar esta operación correctamente es necesario utilizar una técnica de inyección de código.
$get('<%= TextBox1.ClientID %>')
De esta manera será mucho mejor para cuando necesitemos hacer mantenimientos de código, cuando toquemos algo del lado del servidor no afectara el código del cliente.
Archivado en: , ,