【问题标题】:Child control naming standard changed?子控件命名标准变了?
【发布时间】:2012-11-03 10:14:09
【问题描述】:

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

这已经运行了很长时间,但现在它停止了工作,原因是 .NET 渲染引擎或创建内部控件 ID 的任何东西不同。例如,当在另一台服务器上查看页面源时,该页面仍在运行,控件名称为 dgMain__ctl2_cbxChecked,但该服务器上的控件名称为 dgMain__ctl02_cbxChecked 。不同之处在于,在无效版本的“ctl”部分的数字 ID 前面有一个额外的“0”。

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

关于如何解决这个问题的任何线索?

【问题讨论】:

  • 简单的解决方案,不要使用 ID。使用类名和[data-*] 属性将数据传递给 JavaScript。它允许您将脚本保存在自己的 JS 文件中,而不是尝试在 HTML 文件中构建脚本。

标签: javascript asp.net controls


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2016-12-17
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多