调试此错误:发现具有相同ID“ctl00 $ ctl00 $ ctl34”的多个控件

3
多年来,我的网站偶尔会抛出以下异常:

“找到具有相同ID 'ctl00 $ ctl00 $ ctl34' 的多个控件。跟踪要求控件具有唯一的ID。”

有时用户进入页面时会出现此异常-它发生在不同的页面上,并显示不同的控件ID。通常重新加载页面可以解决问题。其他情况下,该异常会在几次刷新后才能解决。

我知道,当您将动态控件添加到页面并意外在一个命名容器中使用相同的ID时,通常会发生此错误,因此我了解错误的含义。

但是,在我的网站上,我没有添加动态控件。至少我不知道。

我正在运行第三方组件,例如Umbraco、Telerik和Peter Blum,它们几乎肯定会在某些时候动态地向控件树添加控件,但是像我说的那样,这个错误已经存在多年,跨越了所有这些模块的主要版本。

异常的间歇性表明某种多线程定时问题或在某处使用随机数。谁知道...我找不到代码中的原因。

所以我的问题是-鉴于整个堆栈跟踪都在.NET框架中,我该如何调试此问题?
3个回答

2
根据我的经验,当您在没有首先打开app_offline.htm的情况下更新服务器上的页面(文件),同时某些用户尝试打开您的站点时,就会发生这种情况。
特别是如果您从ftp更新文件(这需要一些时间)或仅上传aspx或仅上传代码后面的文件。
因此,在您上传文件时,asp.net触发编译,因为它发现文件有所不同,但由于文件还没有完全更新,编译后的dlls混乱了。
  • 我建议先打开asp_offline.htm文件。
  • 我还建议,如果您尝试更新一个或两个文件,则更新它们的aspx和代码后面的文件。
  • 如果您遇到此问题,快速解决方法是打开asp_offline.htm文件,只需打开web.config,进行一行并保存,然后删除asp_offline.html。这样,您就可以发出更新网站并查找所有更改的信号。
另一种可能的方法是禁用编译优化并强制其编译大多数文件,即使我认为这个技巧对我无效。
<compilation optimizeCompilations="false">

希望这能帮到你。

0

听起来你正在寻求故障排除步骤或想法。

也许以下其中之一可以帮到你:

  • 列出所有发生此异常的页面名称或URL。它是同一页吗?还是一组带有第三方控件的页面?这些页面是否混合了许多第三方控件(例如Telerik和Blum)?

  • 事件查看器中是否有任何提示可能是罪魁祸首?

  • 这些第三方控件中是否有任何用于记录日志的API?

  • 这些第三方控件的API是否允许任何“帮助”、种子或命名约定?

  • 考虑ASP.NET 4的新ClientIDMode属性作为可能的潜在解决方案。我猜这取决于供应商是否已经实现。也许将您的应用程序转换为.NET 4并在测试环境中查看是否可以重现?我怀疑由于其随机性质,您可能无法可预测地重现此问题。


0
如果您正在动态创建数据绑定控件,请确保在调用DataBind()方法之前将它们添加到页面或页面上的控件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接