2010-08-25 12 views
6

El siguiente código no funciona. El marcado está en un Control de usuario y supongo que es por eso que ClientID devuelve el prefijo incorrecto para el ID de TextBox.ASP.Net: ClientID no es correcto en el código subyacente de un control de usuario

de marcado:

<INPUT id="txtName" runat="server" maxlength="50" style="WIDTH:100px"> 
<INPUT type="button" value="Find Your Doctor" id="btnFind" runat="server" 
     style="MARGIN-LEFT:10px;WIDTH:130px"> 

de código subyacente:

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

Resultados en el navegador:

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

Como se puede ver, el parámetro de la llamada JavaScript es DoctorsMainArea1_ctl00_txtName, pero la identificación real del elemento de entrada es DoctorsMainArea1_ctl01_txtName.

¿Alguna idea de cómo solucionar esto? jQuery? No estoy tan interesado en una explicación de lo que está sucediendo (quizás haya otro control en esta página que interfiera), sino una forma más sólida de resolver el problema.

+1

¿Por qué necesita usar document.getElementById cuando es el evento onclick para el mismo control que está tratando de recuperar? ¿No puede simplemente usar "esto" (que devolverá el cuadro de entrada. Entonces ni siquiera tendrá que probar y resolver el id, y no necesitará runat = "servidor"). – RPM1984

+0

El controlador onclick para el botón se coloca junto al servidor porque necesito el código postal y otros parámetros que quité para que el código sea más fácil de leer. – cdonner

+0

¿Está cambiando el árbol de control _después_ leyendo ClientID? – sisve

Respuesta

4

Debe intentar mover el código que agrega el atributo onclick al botón en el evento PreRender (o la anulación OnPreRender) en su página o control de usuario. Eso probablemente debería hacer que ClientID sea correcto.

+0

Estaba en el evento Page_Init. Lo cambiamos al evento de carga de página y funciona bien. – cdonner

0

Una solución rápida:

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

Esto sucede porque usted tiene un marcador de contenido en su página en alguna parte. etiqueta html::

+0

Rápido, tal vez, pero no muy robusto :-) – cdonner

+0

No es robusto, tienes razón. Si estuviera utilizando ASP.NET 4, tendría una mejor compatibilidad con los ID de cliente. Las cosas cambiaron para mejor. ¡Gracias a Dios! –

0

otra solución

<input type="text" name="txtName" id="txtName" /> 

código-bind:

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

y se puede obtener el valor

sólo tiene que utilizar el control HTML.

+0

ps: no da el nombre de repetición en la página, se convertirá en una cadena que como "value1, value2" –

+0

Como dije, este es un control de usuario y tu solución no funciona para varias instancias del control en uno página. Como en este caso no habrá más de uno, y si no sale nada mejor, aún puedo usar su sugerencia (hasta que se rompa la página la próxima vez). Todavía creo que esto se puede hacer de manera más elegante con jQuery. – cdonner

5

No sé qué versión de asp.net está utilizando, pero en 4.0 puede declarar dentro de cualquier control de servidor ClientIDMode = "static" y le dará la identificación exacta en el navegador.

Ejemplo:

<asp:Textbox id="txtName" runat="server" ClientIdMode="static"/> 

Otros son predecibles, heredar y que puede ser utilizado con ClientIdRowsuffix.Can utilizarse a nivel de página y aun en las páginas maestras e incluso en el archivo web.config.

Ejemplo de archivo web.config: Video

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

Vistas Craig de zapatero en tekpub, también se puede leer más sobre él en el blog de Rick link text. Es muy bueno, aunque

+0

Estamos en el marco 3.5 – cdonner

+0

Gracias, eso funcionó para mí en 4.0 – Mhmd

Cuestiones relacionadas