惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Cyberwarzone
Cyberwarzone
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
小众软件
小众软件
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
Security Archives - TechRepublic
Security Archives - TechRepublic
W
WeLiveSecurity
Cloudbric
Cloudbric
博客园 - 司徒正美
美团技术团队
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
PCI Perspectives
PCI Perspectives
宝玉的分享
宝玉的分享
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security
Last Week in AI
Last Week in AI
S
Schneier on Security
N
News | PayPal Newsroom
B
Blog RSS Feed
L
LINUX DO - 最新话题
T
Troy Hunt's Blog
S
Secure Thoughts
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tenable Blog
S
Securelist
L
LangChain Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
InfoQ
H
Heimdal Security Blog
Cisco Talos Blog
Cisco Talos Blog
F
Full Disclosure
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
K
Kaspersky official blog
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
阮一峰的网络日志
阮一峰的网络日志
C
Cisco Blogs

博客园 - 良村

元数据驱动开发 - 面向对象编程思想的补充 用ANTLR实现表达式词法和语法分析器 我的开源项目分享-基于SharpBrowser二次开发的定制浏览器,过程中填坑无数 AI是什么 现阶段AI编程无法取代程序员 用zrender实现工作流图形化设计(附范例代码) 特殊字符
导致的Javascript脚本异常 不同寻常的浏览器请求无响应错误 进销存管理中对红冲处理的误区 进销存管理中负库存产生的原因以及对应措施 打造自己的Html文本编辑控件 探讨对Web控件的异常处理 看了一篇不错的文章 - 使用 UTF-8 对 XML 文档进行编码 Ajax学习笔记(2) - 一定要用XML吗? Ajax 学习笔记(1) ASP.NET控件编写心得总结- 以后会写详细一点 CodeDom.CodeArrayCreateExpression不能生成多维数组的创建表达式 用NAnt编译带有资源文件(*.resx,*.bmp,*.gif等)的C#项目 网址收藏 C#实现Singleton的两种方法的比较 发现Maxthon(myIE2)浏览器处理javascript脚本时的奇怪现象 - 良村 - 博客园 页面缓冲与Asp.Net的性能优化(设置Page.Buffer属性) 如何使用AdminScripts脚本创建虚拟目录 采用HttpModules来重写URLs(实践篇)
ASP.NET控件编写日记-当心“用过的控件”!
良村 · 2005-02-20 · via 博客园 - 良村

“用过的控件”就是指曾经加入过Controls(子控件集合)中的控件。这些“用过的控件”再一次被加入Controls中时,可能造成控件ID冲突,症状为:


中文版的错误信息:

[HttpException (0x80004005): 找到多个具有相同 ID“c1:_ctl1:_ctl0:_ctl0”的控件。Trace 要求控件具有唯一的 ID。]

另附上英文版的错误信息(便于使用google查询英文资料):

[HttpException (0x80004005): Multiple controls with the same ID“c1:_ctl1:_ctl0:_ctl0”. Trace requires that controls have unique IDs. ]

由于出错点位于.Net框架的基类中,调试跟踪都不太方便,费了不少功夫才发现问题。这个错误的原因与ASP.NET中的控件命名处理方式有关:
ASP.NET中的所有控件都有Controls(子控件集合)这个属性,在将子控件加入Controls中时,ASP.NET会对加入的控件进行命名操作。如果该控件已经指定了ID(即ID不为空),则沿用该控件已有的名字;如果控件没有指定ID(即ID为空),则系统会为该控件自动分配一个名字(自动命名的规则尚不清楚)。问题就出在这个自动分配的名字上,这个名字可能会与非自动命名控件的名字相同(这个不知道算不算系统Bug?),于是就会出现上面的错误信息。

系统自动指定的ID名字都以下划线开头,所以只要非自动命名的控件名字都不以下划线开头,就可以有效避免发生重复。同一次进行自动命名的控件之间是不会发生名字重复的,但在回发情况下,控件可能会创建两次,这时候也容易发生名字重复。例如:
编写这样一个容器型控件MyPanel,有两个Panel为工具栏和内容栏,其中都可以加入若干控件。
用两个ArrayList来存放加入的控件。并在CreateChildControls()中将ArrayList中的控价加入Controls中,如下:
foreach (control c in m_List1)
{
    Controls.Add(c);
}
上述写法实际上是有隐患的,如果在PostBack情况下,MyPanel可能被创建两次,在第一次创建MyPanel时,系统为m_List1中的控件分配了自动命名的ID,然后MyPanel又被创建了一次,而m_List1中的控件来源于父类,可能并没有重新创建,依然是那些已被自动命名的控件(以下划线开头的ID),这时系统不会为m_List1中的控件自动命名,这些控件的名称就很容易与系统中的自动命名控件重复,发生系统错误。
上面说的这个问题比较隐蔽,但也比较容易避免,比如采用如下写法就可以:
foreach (control c in m_List1)
{
    c.ID = String.Empty;
    Controls.Add(c);
}
将控件的ID置为空,系统就会为控件分配自动命名的ID了。但这个方法会清空非自动命名控件的ID,所以还可以加上判断,当控件ID以下划线开头时,才进行清空。这里也要提醒大家,对控件指定ID时,不要指定以下划线开头的名称,以免重复!