发生了一些非常奇怪的事情。我有一个控件继承asp:DataGrid
ID="dgLookups"
。我在使用它的.ascx中紧跟DataGrid之后添加了<%: dgLookups.ClienID %>
,并且在页面生命周期的渲染阶段,datagrid的ClientID仍为ctl08_ctl06_dgLookup
。
这是奇怪的地方。我发现了两种不同的行为。无论行为是什么,它都会在渲染期间的某个时间点与DOM中显示的时间之间发生。
生成的表格元素的ID更改为ctl08_ctl06_dgLookup_ctl00
。
生成的表格元素获得ctl08_ctl06_dgLookup_ctl00
的额外 ID属性,添加到元素的开头。
在这两种情况下,这会破坏依赖于 的元素id的脚本与控件的ClientID相同。ctl08_ctl06_dgLookup
我原本认为它可能是一个客户端脚本,即使ID具有非常ASP.net格式的后缀,但我检查了开发人员工具的Chrome网络选项卡中的原始响应,并且ID已经被添加。有趣的是,响应有两个ID,但DOM只有一个。
我还认为由于DataGrid位于asp:UpdatePanel
内部可能会有一些奇怪的情况,但是注释掉UpdatePanel并没有解决问题。
设置DataGrid的ClientIDMode="Static"
确实解决了这个问题,但这并不理想,特别是因为这个问题出现在多个控件中;他们所有人都同时开始讨厌,所以大概都是根本问题。
我甚至不知道如何继续调试它。有什么想法吗?
我添加了
<% Control dgLookup = this.FindControlRecursive("dgLookup");
if (dgLookup != null)
{
Response.Write(dgLookup.ClientID);
}
%>
到Default.aspx
的末尾,输出为ctl08_ctl06_dgLookup
。
在javascript控制台中,我跑了:
$("[id*='ctl00']")
结果是表格和表格特定列中的所有项目。就好像手动添加后缀一样。
我注意到dgLookup.EffectiveClientIDMode
设置为AutoID
。当我手动将ClientIDMode
设置为Predictable
时,EffectiveClientIDMode已更改,但添加的id属性未更改。