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

时间:2010-11-02 23:47:37

标签: asp.net

几年来,我的网站非常间歇地抛出以下异常:

  

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

     

at System.Web.TraceContext.AddNewControl(String   id,String parentId,String type,   Int32 viewStateSize,Int32   controlStateSize)

     

at System.Web.UI.Control.BuildProfileTree(String   parentId,Boolean calcViewState)

     

....等(整个堆栈跟踪在System.Web命名空间内)

     

在   System.Web.HttpApplication.ExecuteStep(IExecutionStep   步,布尔& completedSynchronously)

有时用户会转到某个页面并抛出此异常 - 它发生在不同的页面上,并显示不同的控件ID。通常,重新加载页面将起作用。其他时候,异常将在修复之前持续进行一些刷新。

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

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

我正在运行像Umbraco,Telerik和Peter Blum这样的第三方组件,他们几乎肯定会动态地将控件添加到控件树中,但是,就像我说的那样,这个错误已存在多年,主要版本所有这些模块。

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

所以我的问题是 - 如果整个堆栈跟踪都在.NET框架内,我怎么能去调试这个问题呢?

3 个答案:

答案 0 :(得分:2)

根据我的经验,当您更新服务器上的页面(文件)时,首先打开 app_offline.htm ,同时某些用户尝试打开您的网站。

特别是如果您从ftp更新文件(这需要一些时间)或者只上传aspx或仅上传文件背后的代码。

因此,当您上传文件时,asp.net会触发编译,因为他在文件中找到了一些不同的文件,但由于文件未完全更新,因此编译后的dll会出现问题。

  • 我建议先打开asp_offline.htm文件。
  • 我还建议您尝试仅更新一个或两个文件,然后将它们更新为aspx和代码隐藏文件。
  • 如果您看到此问题,快速解决方法是打开asp_offline.htm文件,只需打开web.config,创建一行并保存,然后删除asp_offline.html。这样您就可以再次更新网站并找到所有更改。

其他可能的方法是禁用编译时的优化并强制他编译大部分文件,即使我认为这个技巧对我不起作用。

<compilation optimizeCompilations="false">

希望得到这个帮助。

答案 1 :(得分:0)

听起来您正在要求排除步骤或想法。

也许其中一个可能会有所帮助:

  • 对发生此异常的所有页面名称或URL进行编目。它是同一页吗?它是一组具有第三方控件之一的页面吗?这些页面是否混合了许多第三方控件(即Telerik和Blum)?

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

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

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

  • ASP.NET 4's New ClientIDMode Property视为可能的潜在解决方案。我想这应该由供应商实施。也许在测试环境中将您的应用程序转换为.NET 4,看看是否可以再现?我怀疑,因为它本质上是随机的,你可能无法预测地重现这个问题。

答案 2 :(得分:0)

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