共用方式為


Web Form 控制項 ID 解析

更新:2007 年 11 月

當您在 Web 伺服器控制項上宣告 ID 屬性,提供程式設計方式存取控制項時,ASP.NET 網頁架構會自動確認您所宣告的 ID 在整個 ASP.NET Web 應用程式中是唯一的。

命名容器

ASP.NET Web 架構透過 INamingContainer 介面,為實作應用程式的每個類別產生命名容器,提供自動控制項 ID 解析。命名容器會在 ASP.NET Web 網頁控制項階層架構內,定義新的 ID 命名空間。然後命名容器會允許網頁架構,為該命名空間內產生的每個 Control 物件 UniqueID 屬性產生值。UniqueID 屬性與您宣告的 ID 屬性不同,這是控制項的完整識別項。

實作 INamingContainer 的類別包含:PageDataListGridViewDataListItemDataGridItemRepeater。一般來說,能夠建立子控制項的控制項會動態實作 INamingContainer

Page 類別會當做網頁控制項階層架構的最上層命名容器。

資料繫結案例中的名稱解析

網頁架構提供的自動命名解析在資料繫結案例中變得很重要。下列程式碼範例示範在網頁上所宣告的控制項。

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

Label 控制項繫結至資料來源,並且 Repeater 控制項逐一查看該資料來源的項目時,即使您只有為每個執行個體指派一個 ID MyLabel,網頁也必須要能夠以程式設計方式區別不同的 Label 控制項執行個體。網頁架構會使用每個控制項的完整 UniqueID 屬性,區別不同的執行個體。例如,下列程式碼會產生三個版本的 Label 控制項,並且將 UniqueID 屬性值寫入網頁。

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

當要求這個網頁時,就會將下列資訊寫入網頁:

  • 名為 MyDataList 的 Repeater 控制項命名容器。這個命名容器相依於指定給 .aspx 檔案的名稱。

    注意事項:

    如果這個範例的 .aspx 檔案是 MySample1.aspx,命名容器的類別會是 ASP.mysample1_aspx,而命名容器會是 Page。

  • 當做命名容器之下一個控制項的執行個體,也就是 Repeater 控制項。此容器名稱會以其整個命名空間限定詞顯示。

  • Repeater 控制項內部的每個 Label 控制項之 UniqueID 屬性。

    注意事項:

    撰寫程式碼時,請不要參考使用所產生之 UniqueID 屬性值的控制項。您可以將 UniqueID 屬性視為控制代碼 (例如,藉由將其傳遞到處理序),但不應依賴它的特定結構。

請參閱

工作

HOW TO:利用 ID 找出 ASP.NET Web 網頁中的子控制項

HOW TO:存取 Web 伺服器控制項命名空間的成員

概念

ASP.NET Web 伺服器控制項概觀

使用 NamingContainer 屬性決定控制項的命名容器