Поделиться через


Разрешение идентификации элементов управления Web Form

Обновлен: Ноябрь 2007

При объявлении атрибута ID веб-серверного элемента управления для обеспечения программного доступа к этому элементу управления платформа ASP.NET автоматически гарантирует уникальность объявленного идентификатора для всего веб-приложения ASP.NET.

Контейнер имен

Платформа ASP.NET снабжает приложения автоматическим разрешением идентификации элементов управления посредством интерфейса INamingContainer, который создает контейнер имен для каждого реализующего его класса. Контейнер имен определяет новое пространство имен ID внутри иерархии элемента управления веб-страницей ASP.NET. Контейнер имен позволяет платформе страниц генерировать значение для свойства UniqueID каждого объекта Control, создаваемого внутри этого пространства имен. Свойство UniqueID отлично от объявляемого свойства ID тем, что оно является полным идентификатором для элемента управления.

К классам, реализующим INamingContainer, относятся: Page, DataList, GridView, DataListItem, DataGridItem и Repeater. В целом, элементы управления, которые могут динамически создавать дочерние элементы, реализуют INamingContainer.

Класс Page выступает как контейнер имен высшего уровня для иерархии элемента управления данной страницы.

Разрешение имен при привязке к данным

Автоматическое разрешение имен, обеспечиваемое платформой страниц, становится важным в сценариях с привязкой к данным. Обратите внимание на следующий пример, который показывает объявленные на странице элементы управления.

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

Когда элемент управления Label привязан к источнику данных и элемент управления Repeater выполняет итерацию элементов от этого источника данных, то страница должны быть способна при помощи программных средств различать экземпляры элемента управления Label, даже если каждому экземпляру был присвоен только идентификатор MyLabel. Платформа страниц осуществляет это при помощи полного свойства UniqueID для каждого элемента управления. Например, следующий код создает три версии элемента управления Label и записывает значения их свойства UniqueID на страницу.

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

При запросе этой страницы для нее записывается следующее:

  • Контейнер имен элемента управления Repeater с именем MyDataList. Контейнер имен зависит от имени, данного файлу .aspx.

    hw8sf6fb.alert_note(ru-ru,VS.90).gifПримечание.

    Если бы в данном примере файлом .aspx был файл MySample1.aspx, то класс контейнера имен был бы ASP.mysample1_aspx, а контейнер имен был бы Page.

  • Пример следующего элемента управления, служащего контейнером имен, а именно элемента управления Repeater. Контейнер имен выводится с полным квалификатором всего пространства имен.

  • Свойство UniqueID каждого элемента управления Label находится внутри элемента управления Repeater.

    hw8sf6fb.alert_note(ru-ru,VS.90).gifПримечание.

    Не следует создавать код, ссылающийся на элементы управления, с помощью значения созданного свойства UniqueID. Со свойством UniqueID можно обращаться как с дескриптором (например, путем передачи его в процесс), но не следует полагаться на то, что оно имеет определенную структуру.

См. также

Задачи

Практическое руководство. Поиск дочерних элементов управления по идентификатору на веб-странице ASP.NET

Практическое руководство. Обращение к членам контейнера имен серверного веб-элемента управления

Основные понятия

Общие сведения о серверных веб-элементах управления ASP.NET

Использование свойства NamingContainer для определения контейнера именования элемента управления