asp.net clientid

Forzar identificadores de cliente en ASP.NET



clientid (6)

Sé que en la próxima versión de ASP.NET finalmente podremos establecer los clientids en los controles de System.Web sin que el framework lo haga por nosotros de una manera casi inteligente, por ejemplo:

id="ctl00__loginStatus__profileButton"

¿Alguien sabe un buen método mientras tanto para forzar el ID anterior a algo así como

id="profileButton"

La razón principal de esto es la manipulación de los clientids en jQuery cuando se agregan dinámicamente controles a una página. El problema que veo es el cambio de los identificadores que romperán Viewstate?


A menudo me he encontrado con este "problema" mientras desarrollo en webforms asp.net. En la mayoría de los casos, tiendo a usar la clase css del elemento.

jQuery(".My .Container12")

Antes de comenzar a manipular el id: s, ¿quizás esa sea una forma de manejarlo también? Es una solución simple.


El rendimiento no es excelente, pero puede usar esta sintaxis de selector para hacer coincidir los ClientIDs desordenados:

$("[id$=''_profileButton'']")

Eso coincide con cualquier elemento que termine en _profileButton . Agregar el subrayado inicial asegura que está haciendo coincidir el elemento deseado y no otro elemento que termina en la subcadena "profileButton" (por ejemplo, "myprofileButton").

Como tiene que iterar en todo el DOM, el rendimiento puede ser pobre si lo usa en un bucle o varias veces a la vez. Si no lo usa en exceso, el impacto en el rendimiento no es muy significativo.


Hay otra solución que no se menciona que es subclasificar los controles ASP.NET y forzar los ID:

public class MyCheckBox : CheckBox { public string ForcedId { get;set; } public override string ID { get { if (!string.IsNullOrEmpty(ForcedId)) return ForcedId; else return base.ID; } set { base.ID = value; } } public override string ClientID { get { return ID; } } }

Luego use esto donde sepa que los ID nunca chocarán :

<mytag:MyCheckBox ForcedId="_myCheckbox" runat="server" />

Si usa listas, deberá escribir un ListControlAdapter y también adaptadores para cada tipo de lista que esté utilizando (menú desplegable, casilla de verificación, botón de radio, cuadro de lista). Alternativamente cruza las piernas y espera por .NET 4.0.


Lo que tiendo a hacer es generar dinámicamente métodos javascript que manejen esto. Puede hacer esto en marcado o código detrás así que por ejemplo:

<script language="javascript" type="text/javascript"> function doXYZ() { $("#" + getListBoxId()).css(...) } function getListBoxId() { return "<%=this.myListBox.ClientId>"; } </script>

También puede construir las funciones en el código subyacente y registrarlas.

EDITAR

Hace un par de meses tuve que arreglar la identificación de algunos controles del servidor, logré hackearlo y describí mi método aquí .

Básicamente, debe colocar los controles dentro de un contenedor de nombres como un control de usuario, y luego anular un par de propiedades que evite que los controles secundarios obtengan su uniqueid.


Otra forma sería ajustar su control con un div o span con una identificación estática, y luego acceder al control a través de eso.

P.ej

<span id="mySpan"> <asp:TextBox id="txtTest" runat="server" /> </span>

A continuación, puede orientar etiquetas de entrada dentro de MySpan. (aunque estoy de acuerdo en que sería bueno poder especificar un buen nombre, siempre que pueda manejar los conflictos de nombres ...)


Tienes que usar el atributo ClientIDMode :

<asp:xxxx ID="fileselect" runat="server" ClientIDMode="Static"/>