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

首先我先说明下之所以最后写Predictable,是因为我发现控件的ClientIDMode为Predictable时生成ClientID的机制会非常复杂,要分好几个部分分别进行讨论,其中还有特殊情况,所以我在这里只能说尽量将我发现的Predictable生成ClientID的机制阐述清楚。

当控件的ClientIDMode选中为Predictable时,该控件的ClientID 值是通过串联父容器控件(诸如GridView、ListView、LoginView等就是容器性控件)的 ClientID 值生成的。另外如果该控件是在显示多个数据行的父容器控件或祖先容器控件中(例如GridView、ListView就是显示多数据行的容器控件),则还会在该控件ClientID 值的末尾添加 ClientIDRowSuffix 属性中指定的数据字段的值。 对于 GridView 控件,ClientIDRowSuffix 属性可以指定多个数据字段。 如果 ClientIDRowSuffix 属性为空白,则在末尾添加递增的行号,而非数据字段值。 各部分之间以下划线字符 (_) 分隔。

以上是MSDN的说法,但是经过试验,我发现Predictable的特性更应该是用这么个式子来表达:

Inherit[+"_"+ClientIDRowSuffix]

意思就是说,如果一个控件的ClientIDMode选中为Predictable,那么在ASP.NET生成该控件的ClientID时首先会去看该控件所属的父容器控件的ClientIDMode是什么值,然后先用该控件父容器控件的ClientIDMode规则生成该控件本身的ClientID,最后如果该控件所属的父容器控件或祖先容器控件是显示多个数据行的容器控件,还会根据父容器控件或祖先容器控件的ClientIDRowSuffix属性的值在该控件已生成的ClientID后面加上一个后缀字符串。

下面将几种情况逐一列出来单独解释:

<1>如果父容器控件的ClientIDMode值为AutoID

 如果父容器控件或祖先容器控件为显示多个数据行的容器控件,那么该控件的ClientID格式为:[父/祖先容器控件的ID+"_"+[行号格式+"_"]]+该控件自身ID+"_"+[ClientIDRowSuffix],其中ClientIDRowSuffix部分是什么后面会单独说明,其中:[父/祖先容器控件的ID+"_"+[行号格式+"_"]],就是该控件自身ClientIDMode值继承父容器控件ClientIDMode值AutoID生成的ClientID结果,其中的[行号格式+"_"]部分是否存在依赖于[父/祖先容器控件]部分是否是显示多个数据行的容器控件(这里不明白请看前面的AutoID部分)。

如果父容器控件或祖先容器控件都不是显示多个数据行的容器控件,那么该控件的ClientID格式为:[父/祖先容器控件的ID+"_"]+该控件自身ID,可见这个格式就是该控件自身ClientIDMode值继承父容器控件ClientIDMode值AutoID生成的ClientID结果(这里不明白请看前面的AutoID部分)。

下面我就举一个父容器控件是多数据行容器控件且其ClientIDMode为AutoID的例子,将上面的代码再做更改,将Label1的ClientIDMode属性值改为Predictable,并且设置其父容器控件grd_Account的ClientIDMode为AutoID:

<asp:GridView runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="Account Number" DataSourceID="sds_account" PageSize="5" ClientIDMode="AutoID" > <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>

可以看到生成的Label的控件的ID诸如:grd_Account_ctl02_Label1_0正是上面所述格式:父容器控件的ID(grd_Account)+"_"+行号格式(ctl02)+"_"+该控件自身ID(Label1)+"_"+[ClientIDRowSuffix](0)。

<2>如果父容器控件的ClientIDMode值为Static

 如果父容器控件或祖先容器控件为显示多个数据行的容器控件,那么该控件的ClientID格式为:该控件自身ID+"_"+[ClientIDRowSuffix],其中ClientIDRowSuffix部分是什么后面会单独说明,其中:该控件自身ID,就是该控件自身ClientIDMode值继承父容器控件ClientIDMode值Static生成的ClientID结果(这里不明白请看前面的Static部分)。

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

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