Condividi tramite


Risoluzione degli ID dei controlli Web Form

Aggiornamento: novembre 2007

Quando si dichiara un attributo ID su un controllo server Web per fornire accesso a livello di codice a tale controllo, il framework della pagina ASP.NET garantisce automaticamente che l'ID dichiarato sarà univoco in tutta l'applicazione Web ASP.NET.

Il contenitore di denominazione

Il framework della pagina ASP.NET fornisce alle applicazioni una risoluzione automatica dell'ID di controllo mediante l'interfaccia INamingContainer che genera un contenitore di denominazione per ogni classe che la implementa. Tale contenitore definisce un nuovo spazio dei nomi ID all'interno della gerarchia dei controlli di una pagina Web ASP.NET. Consente quindi al framework della pagina di generare un valore per la proprietà UniqueID di ogni oggetto Control generato all'interno di tale spazio dei nomi. La proprietà UniqueID è diversa dalla proprietà ID dichiarata in quanto rappresenta l'identificatore completo di un controllo.

Le classi che implementano INamingContainer includono: Page, DataList, GridView, DataListItem, DataGridItem e Repeater. In generale, i controlli che possono creare controlli figlio implementano l'interfaccia INamingContainer in modo dinamico.

La classe Page ha la funzione di contenitore di denominazione di primo livello per la gerarchia di controlli della pagina in questione.

Risoluzione dei nomi negli scenari di associazione dati

La risoluzione automatica dei nomi fornita con la struttura della pagina diventa essenziale negli scenari di associazione dati. Si consideri l'esempio riportato di seguito in cui sono riportati i controlli dichiarati in una pagina.

<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 il controllo Label viene associato a un'origine dati e il controllo Repeater scorre gli elementi di tale origine dati, la pagina deve essere in grado di distinguere a livello di codice le diverse istanze del controllo Label, anche se a ogni istanza è stato assegnato solo l'ID MyLabel. Nella struttura della pagina questa operazione viene eseguita utilizzando la proprietà UniqueID completa di ogni controllo. Nel codice di esempio riportato di seguito vengono, ad esempio, generate tre versioni del controllo Label e i valori della relativa proprietà UniqueIDvengono scritti nella pagina.

  <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 la pagina viene richiesta, viene scritto quanto segue al suo interno:

  • Il contenitore di denominazione del controllo Repeater chiamato MyDataList. Tale contenitore dipende dal nome assegnato al file aspx.

    Nota:

    Se il file aspx di questo esempio fosse MySample1.aspx, la classe del contenitore di denominazione sarebbe ASP.mysample1_aspx, ma il contenitore di denominazione sarebbe Page.

  • L'istanza del controllo successivo che funge da contenitore di denominazione, ovvero il controllo Repeater. Questo nome di contenitore viene visualizzato con il relativo qualificatore dello spazio dei nomi completo.

  • La proprietà UniqueID di ogni controllo Label all'interno del controllo Repeater.

    Nota:

    Non scrivere codice che faccia riferimento ai controlli utilizzando il valore della proprietà UniqueID generata. La proprietà UniqueID può essere utilizzata come un handle, passandola ad esempio a un processo, ma è consigliabile non basarsi sul fatto che presenti una struttura specifica.

Vedere anche

Attività

Procedura: individuare i controlli figlio in base all'ID in una pagina Web ASP.NET

Procedura: accedere ai membri del contenitore di denominazione di un controllo server Web

Concetti

Cenni preliminari sui controlli server Web ASP.NET

Utilizzo della proprietà NamingContainer per stabilire il contenitore di denominazione di un controllo