子控制命名标准改变了吗?

时间:2012-11-14 20:38:51

标签: javascript asp.net controls

我在ASP.NET页面上有一个JavaScript函数,当在网格标题中选中“Check All”复选框时,它将检查客户端网格中的所有框。它通过在循环中的每一行的JS函数中构造实际控件ID来实现这一点(即+'_ ctl'+ i +''+其中i是当前循环的行索引)然后将结果控件设置为选中。

这已经很好地工作了很长时间但现在它已停止工作,原因是.NET渲染引擎或其他任何创建内部控件ID的方式不同。例如,不同的服务器,其中这仍然是工作在浏览的网页的源时,控制名称为 dgMain__ctl2_cbxChecked ,但其中这是不工作的服务器上的控制名为的 dgMain__ctl02_cbxChecked 即可。不同之处在于,在“ctl”部分的数字ID前面有一个额外的“ 0 ”卡在了无效的版本上。

我想知道这是否与.NET的版本有关?它不适用于相对较新的本地计算机(用于在较旧的计算机上运行),但它仍然可以在生产中部署的旧服务器上运行。这两个版本都运行ASP.NET 1.1(是的,我知道 - 与时俱进)。

有关如何解决此问题的任何线索?

1 个答案:

答案 0 :(得分:1)

这是一种相当危险的做法。您应该收集生成的控件ClientID服务器端,然后使用ClientScriptManager将它们传递给JavaScript。另一种方法是使用CssClass并使用jQuery或其他一些DOM操作库来查找控件。

控制命名约定使得ID无法保证。它可以从.NET版本更改为版本(尽管不太可能),它可以根据页面上的其他控件或用户控件的嵌套级别等进行更改。