ASP.NET: ClientID y UniqueID

Los controles de ASP.NET tienen las propiedades ClientID y UniqueID que equivalen a los atributos id y name de elementos HTML, respectivamente.

Cuando creamos un TextBox dentro de una página ASPX, por ejemplo, de esta forma:

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

El código generado será el siguiente:

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

El servidor genera automáticamente un elemento input con sus atributos id y name idénticos al ID del control original. Entonces, ¿cuál es la necesidad de ClientID y UniqueID? Veamos dos distintos escenarios:

Usando MasterPage o Web User Control

Supongamos que nuestro textBox1 se encuentra dentro de una página ASPX que a su vez, utiliza un archivo MasterPage.

<asp:Content ContentPlaceHolderID="cphBody" runat="server"> <asp:TextBox ID="textBox1" runat="server"/> </asp:Content>

Al crearse el control en nuestra página, lo veremos de esta forma:

<input type="text" id="ctl00_cphBody_textBox1" name="ctl00$cphBody$textBox1"/>

¿¡Qué es todo eso que agregó en el id y name del control!? Si nos fijamos bien, está formado por tres partes: lo primero es “ctl” más un número consecutivo; en seguida, el nombre del ContentPlaceHolder que contiene al control, y finalmente, el ID que le dimos al control TextBox.

Todo ese código tiene un propósito, obviamente. Cuando trabajamos con Master Pages o Web User Controls, no podemos saber si en otra parte de la página existe o no un control con el mismo ID, y por lo tanto, si habrá más de un elemento HTML con el mismo atributo id. Así que lo que hace .NET es agregar un valor para esos atributos que sea único en la página generada, para lo cual se basa en el nombre del contenedor de la página o web user control, más un consecutivo, para tener mayor certeza. El mismo servidor sabrá cómo identificar cada uno, y utilizarlos por separado cuando se ejecute el código de servidor.

Controles como GridView o ListView

Creemos un GridView en la página:

<asp:GridView ID="grid1" runat="server"> <Columns> <asp:TemplateField> <ItemTemplate> <asp:TextBox ID="gridTextBox" runat="server" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>

En el evento Page_Load en el code-behind, pondremos esto:

// C#
protected void Page_Load(object sender, EventArgs e) {
  var lista = new List<string>();
  for (int i = 1; i <= 10; i++)
    lista.Add(i.ToString());
  grid1.DataSource = lista;
  grid1.DataBind();
}
// VB.NET
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
  Dim lista As New List(Of String)()
  For i As Integer = 1 To 10
    lista.Add(i)
  Next
  grid1.DataSource = lista
  grid1.DataBind()
End Sub

Al correr el sitio y ver el código fuente, encontraremos esto:

<table cellspacing="0" rules="all" border="1" id="ctl00_cphBody_grid1" style="border-collapse:collapse;">
  <tr><th scope="col"> </th><th scope="col">Item</th></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl02$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl02_gridTextBox" /></td><td>1</td></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl03$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl03_gridTextBox" /></td><td>2</td></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl04$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl04_gridTextBox" /></td><td>3</td></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl05$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl05_gridTextBox" /></td><td>4</td></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl06$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl06_gridTextBox" /></td><td>5</td></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl07$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl07_gridTextBox" /></td><td>6</td></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl08$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl08_gridTextBox" /></td><td>7</td></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl09$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl09_gridTextBox" /></td><td>8</td></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl10$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl10_gridTextBox" /></td><td>9</td></tr>
  <tr><td><input name="ctl00$cphBody$grid1$ctl11$gridTextBox" type="text" id="ctl00_cphBody_grid1_ctl11_gridTextBox" /></td><td>10</td></tr>
</table>

Todos los TextBox tienen el mismo ID en la definición del TemplateField, pero aquí podemos ver que los input tienen un nombre distinto por cada uno: consecutivo del contenedor principal – nombre del contenedor principal (Master Page) – nombre del control contenedor (GridView) – consecutivo del control contenedor – nombre del control (TextBox). Todo esto, nuevamente, para asegurarse que el ID no se repite en ningun lugar de la página que se generará.

¿Dónde entra el uso de ClientID y UniqueID? En cualquier lugar donde necesitemos referenciar a un elemento por su id o name en HTML.

Si necesito extraer el valor de textBox1 por medio de Javascript, puedo hacer esto:

var val = document.getElementById('<%= textBox1.ClientID %>');

O darle un estilo propio a un control:

<style>
  #<%= textBox1.ClientID %>{
    color:red;
  }
</style>

Pueden haber muchos casos en los que utilicemos el ClientID para CSS y Javascript, dependiendo la complejidad de la página.

El UniqueID es menos probable que lo utilicemos, pero sí me he topado con un caso en el cual se le puede sacar provecho.

Al enviar los datos de un formulario, ya sea por método GET o POST, los valores enviados son identificados por el atributo name del control. El elemento form usado por .NET utiliza el método POST, cuyos valores pueden ser obtenidos desde Request.Form en el code-behind.

string valor = Request.Form["name_de_input_en_pagina"];

Si por algun motivo necesito obtener el valor de un elemento de entrada a partir del dato enviado en el submit de la forma, puedo hacer esto:

string valor = Request.Form[textBox1.UniqueID];

Como UniqueID es equivalente al name del elemento HTML, sabemos que vamos a recibir el valor exacto del control que necesitamos.

Anuncios

Autor: Israel Muñoz

Soy desarrollador de software, principalmente dedicado a desarrollo de aplicaciones web. Especializado en .NET full-stack, además de tecnologías front-end HTML, CSS y JavaScript. A ratos, profesor de materias de informática. Me gusta mucho todo lo que tiene que ver con las tecnologías nuevas para desarrollo web, y el diseño de sitios y aplicaciones.

2 comentarios en “ASP.NET: ClientID y UniqueID”

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s