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

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

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

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

其生成的HTML代码为:

<table cellspacing="0" rules="all"> <tr> <th scope="col">Account Number</th> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>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,下面是代码:

<asp:GridView runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="Account Number" DataSourceID="sds_account" PageSize="5" ClientIDMode="Static" > <Columns> <asp:TemplateField HeaderText="Account Number" Sort ="Account Number"> <ItemTemplate> <asp:LoginView runat="server" ClientIDMode="Predictable" > <LoggedInTemplate> <asp:Label runat="server" Text="Logged"></asp:Label> </LoggedInTemplate> </asp:LoginView> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>

可以看到在嵌套层次结构中,由于LoginView1所属的父容器控件grd_Account是显示多数据行的容器控件,所以LoginView1的ClientID应该是诸如:LoginView1_0、LoginView1_1等有ClientIDRowSuffix部分的格式,这没有问题,但是按道理来说Label1所在的父容器控件LoginView1不是显示多数据行的容器控件,那么Label1生成的ClientID 应该是诸如LoginView1_0_Label1、LoginView1_1_Label1等这样的没有ClientIDRowSuffix部分的格式,但是为我们来看一下生成的HTML代码:

<table cellspacing="0" rules="all"> <tr> <th scope="col">Account Number</th> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>Logged</span> </td> </tr> </table>

可以看到生成的Label1的ClientID都带表示递增行号的后缀字符串0、1、2等(此外请注意LoginView不会产生HTML代码),也就是有ClientIDRowSuffix部分。

我们再将grd_Account的ClientIDRowSuffix属性更改为数据源中的Account Number字段后再来看看生成的HTML代码:

<table cellspacing="0" rules="all"> <tr> <th scope="col">Account Number</th> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>Logged</span> </td> </tr> <tr> <td> <span>Logged</span> </td> </tr> </table>

可以看到生成的Label1的ClientID也都带ClientIDRowSuffix部分,只不过ClientIDRowSuffix部分现在是数据源中Account Number字段的值。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsfyy.html