代码之家  ›  专栏  ›  技术社区  ›  cbp

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

  •  3
  • cbp  · 技术社区  · 14 年前

    具有相同ID的多个控件 找到“ctl00$ctl00$ctl34”。痕迹 要求控件具有唯一的 身份证。

    Int32 viewStateSize、Int32 控制状态大小)

    在系统.Web.UI.控件.BuildProfileTree(字符串)

    .... etc(整个堆栈跟踪在系统.Web命名空间)

    在 System.Web.HttpApplication应用程序.ExecuteStep(执行步骤)

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

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

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

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

    异常的间歇性性质表明存在某种多线程计时问题,或者在某个地方使用了随机数。谁知道。。。我找不到它的原因 我的 代码。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Aristos    14 年前

    根据我的经验,当您在服务器上更新页面(文件)而不首先打开 应用程序_脱机.htm ,同时一些用户试图打开你的网站。

    特别是当你从ftp更新文件(这需要一些时间)或者当你只上传aspx或者只上传代码隐藏文件时。

    所以当你上传文件的时候asp.net触发编译,因为他在文件中发现了一些不同的内容,但是由于文件没有完全更新,编译后的dll出现了混乱。

    • 如果你看到这个问题,一个快速的解决办法就是打开asp_脱机.htm文件,打开web.config文件,生成一行并保存,然后删除asp_脱机.html. 这样你就给了一个信号,再次更新网站,并找到所有的变化。

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

    <compilation optimizeCompilations="false">
    

    希望这有帮助。

        2
  •  0
  •   p.campbell    14 年前

    听起来像是在询问故障排除步骤或想法。

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

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

    • 事件查看器中是否有任何关于哪一个可能是罪魁祸首的提示?

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

    • 考虑 ASP.NET 4's New ClientIDMode Property 作为一个可能的解决方案。我想应该由供应商来实施。也许在测试环境中将你的应用程序转换成.NET4,看看是否可以复制?我怀疑,由于这是随机的,你可能无法预测地重新处理这个问题。

        3
  •  0
  •   user764200    12 年前