2008-09-22 16 views
7

Si quiero manipular las propiedades de una etiqueta HTML en el servidor dentro de una página aspx en base a un ejemplo de página maestraHTML Tag ClientID en un .NET Proyecto

<a href="#" runat="server" ID="myLink">My Link</a> 

Por ejemplo para dar el enlace de una clase diferente dependiendo es decir, en la página actual

if (Path.GetFileName(Request.PhysicalPath) == "MyPage") 
{ 
myLink.Attributes.Add("class","active"); 
} 

.NET cambia la propiedad ID del enlace a algo así como

<a href="#" ID="ct100-foo-myLink">My Link</a> 

¿Hay alguna manera de evitar que esto suceda y conservar la identificación original?

Gracias de antemano

Respuesta

2

AFAIK no hay manera.

Muestra el árbol de control real, que en este caso es masterpage-content-control.

Sin embargo, si agrega una ID a la página maestra (this.ID = "lo que sea"), verá "lo que sea" en lugar de ctl00 (lo que significa índice de control 0).

+0

¡justo lo que estaba buscando, gracias! – sarsnake

0

No lo creo.

Sin embargo, es probable que desee mantener el nombre original para poder manipular el control con javascript .... si ese es el caso, debe buscar ClientID; devolverá la identificación asignada en tiempo de ejecución.

EDIT:

Parece que hay una manera de hacerlo, pero con un poco de trabajo ... echar un vistazo a ASP.NET Controls - Improving automatic ID generation : Architectural Changes (Part 3)

No he leído el post completo, pero parece que creó su propio contenedor y proveedor de nombres propio. Creo que si se quería dejar el nombre de su control sin tocar, sólo devolvería el nombre de nuevo en

public abstract string SetControlID(string name, System.Web.UI.Control control); 
0

Nunca supe cómo prevenir .NET de hacer esto, pero lo que hice empezar a hacer fue colocar asp : Literales y uso de C# para agregar un WebControl a ellos. Si escribe un WebControl, puede establecer varias propiedades sin que obtenga el ID exclusivo de .NET. Por ejemplo:

<asp:Literal ID="myLink" /> 

...

WebControl a = new WebControl(HtmlTextWriterTag.A); 
a.CssClass = "active"; 
a.Attributes["href"] = "#"; 
Literal text = new Literal(); 
text.Text = "click here"; 
a.Controls.Add(text); 
myLink.Controls.Add(a); 

Lo que resultará en el código HTML siguiente:

<a href="#" class="active">click here</a> 

En general, una solución bastante sucio, pero yo no sabía qué qué hacer en ese momento y tenía una fecha límite para reunirme. ;)

0

Sí, exactamente, tendremos que conservar el ID original por razones de JavaScript y CSS. Me di cuenta de la propiedad ClientId, pero es de solo lectura y no se puede asignar, así que no estoy seguro de cómo la usaría.

0

Este post el blog podría ser útil: Remove Name Mangling from ASP.Net Master Pages (get your ID back!)

La solución en el puesto sobrescribe el método .getElementById, lo que le permite buscar el elemento simplemente utilizando el ID de la normalidad. Quizás puedas adaptarlo a tus necesidades.

Descargo de responsabilidad: Ese comportamiento de ASP.NET es por diseño y es bueno de esa manera, incluso para los controles de servidor HTML como el control en su ejemplo. Server-ID y Client-ID son dos cosas muy diferentes, que no deben mezclarse. Al utilizar páginas maestras o controles de usuario, podría terminar con identificadores de cliente idénticos si no existiera ese mecanismo.

4

No es posible directamente. Puede hacer un nuevo control que herede el enlace y anular su ClientID para devolver directamente el ID. Pero esto parece ser excesivo. Simplemente puede usar el marcado HTML y usar <% # GetClass()%> para agregar la clase cuando la necesite.

En cuanto al uso de JavaScript ClientID:

<a ID="myLink" runat="server">.... 


var ctrl = document.getElementById('<%# myLink.ClientID %>'); 

Por supuesto que necesitan un DataBind en alguna parte del código.

+0

+1. Lo he hecho con éxito de esta manera antes. – Raithlin

+0

Gracias veré si puedo poner en marcha esta solución. Intentando ser lo menos "hacky" posible –

+0

Esto seguramente no es "hacky" :) En realidad, es el propósito de la propiedad ClientID. – rslite

0

¿Por qué no utilizar una etiqueta estándar a, y usar bloques de renderizado para modificarlo, y luego tiene su comportamiento bloqueado en el cliente.

1

Acabo de descubrir una manera fácil de hacerlo si está utilizando jQuery.

var mangled_name = $("[id$=original_name]").attr("id"); 

Así que si usted tiene un control de servidor así:

<asp:TextBox ID="txtStartDate" runat="server" /> 

se puede obtener el nombre revuelto en su jQuery/Javascript con:

var start_date_id = $("[id$=txtStartDate]").attr("id"); 

Dado que es una cadena, también puede usarlo "en línea" en lugar de asignarlo, por ej. concatenándolo con otros elementos para selectores.

Cuestiones relacionadas