Auflösung von Web Forms-Steuerelement-IDs

Aktualisiert: November 2007

Wenn Sie das ID-Attribut eines Webserversteuerelements für den programmgesteuerten Zugriff auf dieses Steuerelement deklarieren, wird vom ASP.NET-Seitenframework automatisch sichergestellt, dass die deklarierte ID für die gesamte ASP.NET-Webanwendung eindeutig ist.

Der Namenscontainer

Das ASP.NET-Seitenframework stellt eine Funktionalität bereit, über die Steuerelement-IDs in Anwendungen automatisch aufgelöst werden. Dies geschieht über die INamingContainer-Schnittstelle, die für jede Klasse, die diese Schnittstelle implementiert, einen Benennungscontainer generiert. Der Benennungscontainer definiert einen neuen ID-Namespace innerhalb der Steuerelementhierarchie einer ASP.NET-Webseite. Mithilfe des Benennungscontainers kann das Seitenframework für die UniqueID-Eigenschaft eines jeden innerhalb des Namespaces generierten Control-Objekts einen Wert generieren. Im Unterschied zur deklarierten ID-Eigenschaft handelt es sich bei der UniqueID-Eigenschaft um den vollqualifizierten Bezeichner eines Steuerelements.

Zu den Klassen, die INamingContainer implementieren, gehören: Page, DataList, GridView, DataListItem, DataGridItem und Repeater. Allgemein lässt sich sagen, dass diejenigen Steuerelemente INamingContainer implementieren, die untergeordnete Steuerelemente dynamisch erstellen können.

Die Page-Klasse dient als Benennungscontainer der obersten Ebene für die Steuerelementhierarchie dieser Seite.

Namensauflösung in Datenbindungs-Szenarien

Die automatische Namensauflösung des Seitenframeworks spielt bei der Datenbindung eine wichtige Rolle. Im folgenden Beispiel werden Steuerelemente auf einer Seite deklariert.

<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"/>

Wenn das Label-Steuerelement an eine Datenquelle gebunden ist und das Repeater-Steuerelement die Elemente der Datenquelle durchläuft, muss die Seite die verschiedenen Instanzen des Label-Steuerelements programmgesteuert unterscheiden können, obgleich jeder Instanz lediglich die ID MyLabel zugewiesen wurde. Dazu verwendet das Seitenframework für jedes Steuerelement die vollqualifizierte UniqueID-Eigenschaft. Im folgenden Codebeispiel werden drei Versionen des Label-Steuerelements generiert und ihre UniqueID-Eigenschaftenwertein die Seite geschrieben.

  <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>

Folgendes wird beim Anfordern der Seite in die Seite geschrieben:

  • Der Benennungscontainer des Repeater-Steuerelements mit dem Namen MyDataList. Dieser Benennungscontainer hängt von dem Namen ab, den Sie der ASPX-Datei gegeben haben.

    Hinweis:

    Die Klasse des Benennungscontainers einer ASPX-Datei mit dem Namen MySample1.aspx wäre ASP.mysample1_aspx, der Benennungscontainer selbst hingegen Page.

  • Die Instanz des nächsten Steuerelements, das als Benennungscontainer dient, das Repeater-Steuerelement. Der Containername wird mit seinem vollständigen Namespacequalifizierer angezeigt.

  • Die UniqueID-Eigenschaft jedes Label-Steuerelements im Repeater-Steuerelement.

    Hinweis:

    Schreiben Sie keinen Code, der auf Steuerelemente mittels der generierten UniqueID-Eigenschaft verweist. Sie können die UniqueID-Eigenschaft wie ein Handle behandeln (z. B. indem Sie sie an einen Prozess übergeben), doch gehen Sie nie von einer bestimmten Struktur der Eigenschaft aus.

Siehe auch

Aufgaben

Gewusst wie: Suchen von untergeordneten Steuerelementen nach ID in einer ASP.NET-Webseite

Gewusst wie: Zugreifen auf Member eines Namenscontainers eines Webserversteuerelements

Konzepte

Übersicht über ASP.NET-Webserversteuerelemente

Verwenden der NamingContainer-Eigenschaft, um den Namenscontainer eines Steuerelements zu bestimmen