ASP.NET 4.0配置文件中的ClientIDMode属性详解

2019-05-25 09:24:38王冬梅

如果 ClientIDRowSuffix 属性为空白,则在已生成的子控件ClientID末尾添加递增的行号并在行号前面加上下划线字符 (_) 分隔,比如上面的例子中由于都没有在GridView上设置ClientIDRowSuffix属性,所以ClientIDRowSuffix为空白,那么生成的子控件ClientID最末位都有诸如_0、_1、_2等的递增行号。 

此外还可以设置ClientIDRowSuffix 属性值为父容器控件或祖先容器控件中DataSource数据源中的字段,这样生成子控件ClientID的后缀字符串为ClientIDRowSuffix 指定字段在该行的数据值,并且ClientIDRowSuffix 属性可指定多个DataSource数据源中的数据字段,那么在生成子控件ClientID时会将每个数据字段在该行的值用下划线字符 (_) 进行分隔然后作为ClientID后缀字符串。

现在就举个例子,将上面的代码再做更改将Label1的ClientIDMode属性值改为Predictable,并且设置其父容器控件grd_Account的ClientIDMode也为Predictable,并且将grd_Account的ClientIDRowSuffix设置为数据源sds_account的Account Number字段:

<asp:GridView ID="grd_Account" runat="server" AllowPaging="True" 
  AutoGenerateColumns="False" 
  DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px" 
  Width="676px" PageSize="5" ClientIDMode="Predictable" ClientIDRowSuffix="Account Number" >
  <Columns>
    <asp:TemplateField HeaderText="Account Number" Sort ="Account Number">
      <ItemTemplate>
        <asp:Label ID="Label1" runat="server" Text="Logged" ClientIDMode="Predictable"></asp:Label>
      </ItemTemplate>        
    </asp:TemplateField>
  </Columns>
</asp:GridView>

其生成的HTML代码为:

<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
  <tr>
  <th scope="col">Account Number</th>
  </tr>
    <tr>
  <td>
      <span id="grd_Account_Label1_1060">Logged</span>
    </td>
  </tr>
  <tr>
  <td>
      <span id="grd_Account_Label1_1200">Logged</span>
    </td>
  </tr>
  <tr>
  <td>
      <span id="grd_Account_Label1_1510">Logged</span>
    </td>
    </tr>
</table>

可以看到生成子控件的ClientID的后缀字符串为Account Number字段在GridView上每行的值:1060、1200、1500,其不再是递增的行号.

EX:最后Predictable还有一个很特别的特性:

当控件的ClientIDMode为Predictable且该控件在多个嵌套的容器控件中时,判断该控件是否在显示多数据行的容器控件中时,会具有层次穿透性,它不但会考察父容器控件,还会考察祖先容器控件。

下面就举个例子来说明这种情况,首先grd_Account为显示多数据行的容器控件,它的ClientIDMode设置为Static,在它内部有一个ID为LoginView1的LoginView,我们知道LoginView也是容器性控件,只不过它不是显示多数据行的容器控件,这里设置LoginView1的ClientIDMode属性为Predictable,在LoginView1里面再放置一个ID为Label1的Label,它的ClientIDMode没有设置,所以其值也默认继承为Predictable,下面是代码: