Resolución del identificador de un control de formularios Web Forms
Actualización: noviembre 2007
Cuando declara un atributo ID en un control de servidor Web para proporcionar acceso mediante programación a dicho control, el marco de trabajo de la página ASP.NET garantiza automáticamente que el identificador que declare será único en toda la aplicación Web ASP.NET.
Contenedor de nomenclatura
El marco de trabajo de página ASP.NET proporciona a las aplicaciones una resolución automática de identificadores de control mediante la interfaz INamingContainer, que genera un contenedor de nombres para cada clase que lo implemente. Un contenedor de nombres define un nuevo espacio de nombres ID dentro de una jerarquía de control de página Web ASP.NET. Un contenedor de nombres permite al marco de trabajo de la página generar un valor para la propiedad UniqueID de cada objeto Control generado dentro de ese espacio de nombres. La propiedad UniqueID es diferente de la propiedad ID en la que declara que es el identificador completo para un control.
Las clases que implementan INamingContainer incluyen: Page, DataList, GridView, DataListItem, DataGridItem y Repeater. En general, los controles que pueden crear dinámicamente controles secundarios implementan INamingContainer.
La clase Page sirve de contenedor de nombres de nivel superior para la jerarquía de control de esa página.
Resolución de nombres en escenarios de enlace de datos
La resolución de nombres automática proporcionada por el marco de trabajo de la página es importante en escenarios de enlace de datos. Piense en el ejemplo siguiente, que muestra los controles declarados en una página.
<asp:Repeater id="MyDataList" >
<ItemTemplate>
<asp:Label id="MyLabel" Text="<%# Container.ToString() %>" /><br />
</ItemTemplate>
</asp:Repeater>
<hr />
<asp:Label id="ResultsLabel" AssociatedControlID="MyDataList"/>
<asp:Repeater id="MyDataList" >
<ItemTemplate>
<asp:Label id="MyLabel" Text="<%# Container.ToString() %>" /><br />
</ItemTemplate>
</asp:Repeater>
<hr />
<asp:Label id="ResultsLabel" AssociatedControlID="MyDataList"/>
Cuando el control Label está enlazado a un origen de datos y el control Repeater recorre los elementos de dicho origen de datos, la página debe ser capaz de distinguir mediante programación las diferentes instancias del control Label aunque sólo se haya asignado el identificador MyLabel a cada instancia. El marco de trabajo de la página hace esto utilizando la propiedad UniqueID completa para cada control. Por ejemplo, el siguiente código genera tres versiones del control Label y escribe los valores de la propiedadUniqueID en la página.
<script language="vb" >
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
Dim sb As New StringBuilder()
sb.Append("Container: " + _
MyDataList.NamingContainer.ToString() + "<p>")
Dim a As New ArrayList()
a.Add("A")
a.Add("B")
a.Add("C")
MyDataList.DataSource = a
MyDataList.DataBind()
Dim i As Integer
Dim l As Label
For i = 0 To MyDataList.Controls.Count - 1
l = CType(CType(MyDataList.Controls(i), RepeaterItem).FindControl("MyLabel"), Label)
sb.Append("Container: " & _
CType(MyDataList.Controls(i), RepeaterItem).NamingContainer.ToString() & _
"<p>")
sb.Append("<b>" & l.UniqueID.ToString() & "</b><p>")
Next
ResultsLabel.Text = sb.ToString()
End Sub
</script>
<script language="c#" >
void Page_Load(Object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
sb.Append("Container: " +
MyDataList.NamingContainer.ToString() + "<p>");
ArrayList a = new ArrayList();
a.Add("A");
a.Add("B");
a.Add("C");
MyDataList.DataSource = a;
MyDataList.DataBind();
for (int i = 0; i < MyDataList.Controls.Count; i++)
{
Label l =
(Label)((RepeaterItem)MyDataList.Controls[i]).FindControl("MyLabel");
sb.Append("Container: " +
((RepeaterItem)MyDataList.Controls[i]).NamingContainer.ToString() +
"<p>");
sb.Append("<b>" + l.UniqueID + "</b><p>");
}
ResultsLabel.Text = sb.ToString();
}
</script>
Cuando se solicita esta página, escribe lo siguiente en la página:
El contenedor de nombres del control Repeater denominado MyDataList. Este contenedor de nombres depende del nombre dado al archivo .aspx.
Nota: Si por ejemplo el archivo .aspx fuera MySample1.aspx, la clase del contenedor de nombres sería ASP.mysample1_aspx, pero el contenedor de nombres sería Page.
La instancia del control siguiente que actúa como un contenedor de nombres, concretamente el control Repeater. Este nombre de contenedor se muestra con su calificador de espacio de nombres completo.
La propiedad UniqueID de cada control Label dentro del control Repeater.
Nota: No escriba código que haga referencia a los controles que utilizan el valor de la propiedad UniqueID generada. Puede tratar la propiedad UniqueID como un identificador (por ejemplo, pasándolo a un proceso), pero no debe basarse en que tenga una estructura específica.
Vea también
Tareas
Cómo: Localizar controles secundarios por id. en una página Web ASP.NET
Cómo: Obtener acceso a miembros de un contenedor de nombres de un control de servidor Web
Conceptos
Información general sobre los controles de servidor Web ASP.NET
Utilizar la propiedad NamingContainer para determinar el contenedor de nombres de un control