Partilhar via


Resolução de identificação de controle de Web Forms

Quando você declara um atributo de identificação em um controle de servidor Web para fornecer acesso programático àquele controle, a estrutura da página ASP.NET automaticamente garante que a identificação que você declarar será única em todo o aplicativo da Web do ASP.NET.

Contêiner de nomeação

O framework de página do ASP.NET fornece a seus aplicativos resolução de identificação de controle automática através da interface INamingContainer, que gera um contêiner de nomeação para cada classe que implemente-a.Um contêiner de nomeação define um novo namespace ID em uma hierarquia de controle da página da Web ASP.NET.Um contêiner de nomeação, em seguida, permite que o framework de página gere um valor para a propriedade UniqueID de cada objeto Control gerado dentro desse namespace.A propriedade UniqueID é diferente da propriedade ID que você declara, pois ela é o identificador totalmente qualificado para um controle.

As classes que implementam INamingContainer incluem: Page, DataList, GridView, DataListItem, DataGridItem, e Repeater. Em geral, controles que podem criar controles filho dinamicamente implementam INamingContainer.

A classe Page serve como o contêiner de nomeação de nível superior para essa hierarquia de controle da página.

Resolução de nome no cenários de ligação de dados

A resolução de nomeação automática fornecida pela estrutura da página se torna importante em cenários de ligação de dados.Considere o exemplo a seguir, que mostra controles declarados em uma 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"/>

Quando o controle Label está vinculado a uma fonte de dados e o controle Repeater itera através de itens da fonte de dados, a página deve ser capaz de distinguir programaticamente as diferentes instâncias do controle Label, mesmo que você tenha atribuído somente a identificação MyLabel a cada instância.O framework da página faz isso usando a propriedade totalmente qualificada UniqueID para cada controle.Por exemplo, o código a seguir gera três versões do Label controle e grava seus UniqueID valores de propriedadeNa 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>

Quando esta página é solicitada, ele grava o seguinte na página:

  • O contêiner de nomeação do controle Repeater nomeado MyDataList.Este contêiner de nomeação depende do nome dado ao arquivo.aspx.

    Observação:

    Se o arquivo .aspx para esse exemplo fosse MySample1.aspx, seria a classe de contêiner de nomenclatura ASP.mysample1_aspx, mas seria o contêiner de nomenclatura Page.

  • A instância do próximo controle que serve como um contêiner de nomeação, como o controle Repeater.Esse nome de contêiner é exibido com todo o seu qualificador de namespace.

  • A propriedade UniqueID de cada controle Label dentro do controle Repeater.

    Observação:

    Não gravar código que referencia controles usando o valor do gerado UniqueID propriedade. Você pode tratar a propriedade UniqueID como um manipulador (por exemplo, passando-a para um processo), mas você não deve depender que ela tenha uma estrutura específica.

Consulte também

Tarefas

Como: Localizar filho Controls by ID em uma página da Web do ASP.NET

Como: Membros de acesso de um controle de servidor Web do contêiner de nomenclatura

Conceitos

Visão geral sobre controles do servidor da Web do ASP.NET

Usando a propriedade NamingContainer para determinar um contêiner de nomeação do controle