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" runat="server">
<ItemTemplate>
<asp:Label id="MyLabel" Text="<%# Container.ToString() %>" runat="server"/><br />
</ItemTemplate>
</asp:Repeater>
<hr />
<asp:Label id="ResultsLabel" runat="server" AssociatedControlID="MyDataList"/>
<asp:Repeater id="MyDataList" runat="server">
<ItemTemplate>
<asp:Label id="MyLabel" Text="<%# Container.ToString() %>" runat="server"/><br />
</ItemTemplate>
</asp:Repeater>
<hr />
<asp:Label id="ResultsLabel" runat="server" 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" runat="server">
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#" runat="server">
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