控件的ClientID在Page_PreRender之后发生变化

时间:2015-01-15 18:54:37

标签: asp.net debugging

发生了一些非常奇怪的事情。我有一个控件继承asp:DataGrid ID="dgLookups"。我在使用它的.ascx中紧跟DataGrid之后添加了<%: dgLookups.ClienID %>,并且在页面生命周期的渲染阶段,datagrid的ClientID仍为ctl08_ctl06_dgLookup

这是奇怪的地方。我发现了两种不同的行为。无论行为是什么,它都会在渲染期间的某个时间点与DOM中显示的时间之间发生。

  1. 生成的表格元素的ID更改为ctl08_ctl06_dgLookup_ctl00

  2. 生成的表格元素获得ctl08_ctl06_dgLookup_ctl00的额外 ID属性,添加到元素的开头。

  3. 在这两种情况下,这会破坏依赖于 ctl08_ctl06_dgLookup 的元素id的脚本与控件的ClientID相同。

    我原本认为它可能是一个客户端脚本,即使ID具有非常ASP.net格式的后缀,但我检查了开发人员工具的Chrome网络选项卡中的原始响应,并且ID已经被添加。有趣的是,响应有两个ID,但DOM只有一个。

    我还认为由于DataGrid位于asp:UpdatePanel内部可能会有一些奇怪的情况,但是注释掉UpdatePanel并没有解决问题。

    设置DataGrid的ClientIDMode="Static"确实解决了这个问题,但这并不理想,特别是因为这个问题出现在多个控件中;他们所有人都同时开始讨厌,所以大概都是根本问题。

    我甚至不知道如何继续调试它。有什么想法吗?

    更新1

    我添加了

    <% Control dgLookup = this.FindControlRecursive("dgLookup");
       if (dgLookup != null)
       {
           Response.Write(dgLookup.ClientID);
       }
    %>
    

    Default.aspx的末尾,输出为ctl08_ctl06_dgLookup

    更新2

    在javascript控制台中,我跑了:

    $("[id*='ctl00']")
    

    结果是表格和表格特定列中的所有项目。就好像手动添加后缀一样。

    更新3

    我注意到dgLookup.EffectiveClientIDMode设置为AutoID。当我手动将ClientIDMode设置为Predictable时,EffectiveClientIDMode已更改,但添加的id属性未更改。

0 个答案:

没有答案