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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
量子位
博客园 - 司徒正美
V
V2EX
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
N
Netflix TechBlog - Medium
L
LangChain Blog
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - Brendan

[转载]Manually configuring Microsoft Internet Information Services (IIS) IIS与TOMCAT协同工作---在IIS下运行JSP页面 AXIS部署错误解决方案集锦 使用System.Web.Mail发送Mail的错误解决方案 类的XML序列化(XML Serialization) [翻译]你可以赚钱,但你不能赚时间 Windows 2003 Server配置IIS服务器(ASP, ASP.NET)全功略 Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive 用MS SQL Server事件探查器来跟踪数据库的操作 反反编译工具——Deploy.NET C中获取当前时间的函数 Buffered I/O 与 Non-Buffered I/O性能差异的实例体验 替换函数(Substitution Function) 主定理(Master Theorem) Dynamic Programming之Longest Increasing Subsequence (LIS)问题 ADO.NET数据库连接模块 SQLDMO For C#(翻译) 关联(Association)设计中的扇形陷阱(Fan Traps)和断层陷阱(Chasm Traps) 简单并发控制
ASP.NET控件事件丢失的探究
Brendan · 2006-04-06 · via 博客园 - Brendan

        最近做ASP.NET的项目,突然发现刚才还好好的控件,在我对.aspx修改之后,竟然不能正常运行了。比如说一个简单的button控件,原先有一个button_click事件与之绑定。但在我稍微改了改前台页面的美工之后,它的button_click事件就失效了。后来到那个著名的“Windows Form Designer generated code”,即“InitializeComponent”函数中去看了看,竟然发现事件绑定的代码没了。

        后来在csdn上问了一下,才知道这是Visual Studio.net 2003的著名Bug(好像听说Visual Studio.net 2005中修复了这个bug,不知道真的假的)。这个Bug的重现方法是:你在前台代码中拖进一个控件,然后双击它产生一个简单的事件(一般是click事件)。然后你到“InitializeComponent”函数中看看事件绑定代码在不在。这是如果正常的话,绑定代码应该还在。接着,你剪切(ctrl+x)这个控件,然后复制(ctrl+v)到你想放的页面上其他的一些位置。这时,你再到“InitializeComponent”函数中去看那个事件绑定代码,不出意外,这段代码已经不在了。

        这个bug的逻辑其实很简单。你想想,当你把一个控件删除之后,它在“InitializeComponent”函数中的初始化代码和事件绑定代码肯定也被去掉了。但你可以看到,那个事件处理函数(比如button_click)应该还安静地躺在后面的代码里。其实删除控件与剪切控件是,Visual Studio.net 2003做的是同样的一件事情。但是当你把那个你剪切的控件重新由复制到页面上,其实这个与拖一个新的控件到页面上是没有任何区别的。这就很容易明白为什么事件绑定代码没有出现,因为Visual Studio.net 2003当你是新建一个控件罢了。

        这确实是个恼人的bug,特别当你页面数量很多时,要你一个一个的检查,简直是无法忍受的。这里提供几个方法解决的方法可供参考:

1.当第一次拖入控件时,Visual Studio.net 2003在“InitializeComponent”函数中为你创建了相关事件绑定代码之后,想办法把这些代码移出“InitializeComponent”函数,因为Visual Studio.net 2003的“Windows Form Designer generated code”功能只会修改“InitializeComponent”函数中的代码。移出的方法很多,可以放在“onInit”函数中,或者另写一个函数放置。

2.如果你做了剪切操作之后,请记得重新绑定它的事件代码。这是请不要双击这个控件,而是到事件标签中选择对应事件的下拉框,你会看看你剪切前就写好的那个事件处理代码。

3.如果你还是不放心你的大量页面中是不是由事件没有做绑定,你可以试试下面的这个工具(转载自http://kb.csdn.net/.net/Articles/200512/a448b858-1521-4cc8-a4ae-897f50f6b591.html)。它是在事后对所有.cs文件中的事件处理函数找其相应的绑定。使用这个代码有一个局限,就是对于那些不喜欢删除不再使用的事件处理函数的人来说,这个工具就意义不大了。

下面贴一下这个工具的检查绑定的代码

private ArrayList FindLost()
        
{
            Regex objRegex ;
            Regex objRegex0 ;
            Match objMatch ;
            Match objMatch0 ;
            ArrayList result 
= new ArrayList();
            
string content = string.Empty;
            
string functionName = string.Empty;
            
bool flag = rb0.Checked;
            
foreach(string f in FileListResult)
            
{                
                
using (StreamReader objStreamReader = new StreamReader(f)) 
                
{
                    
if((content=objStreamReader.ReadToEnd())!=null)
                    
{
                        objRegex 
= new Regex("private[\\s]+void[\\s]+(?<FunctionName>\\w+)\\(object[\\s]+(?<senderName>\\w+),[\\s]+(?<EventArgsPrefix>[A-Za-z0-9_\\.]*)EventArgs[\\s]+(?<EventArgsName>\\w+)\\)", RegexOptions.IgnoreCase);
                        objMatch 
= objRegex.Match(content);
                        
while(objMatch.Success)
                        
{
                            functionName 
= objMatch.Result("${FunctionName}");
                            objRegex0 
= new Regex("\\((?<senderName>[this\\.]*)"+functionName+"\\)");
                            objMatch0 
= objRegex0.Match(content);
                            
if(!objMatch0.Success)
                            
{
                                
if(flag)
                                
{
                                    result.Add(
string.Format("{0},丢失事件:{1}",f.Replace(txtPath.Text,""),functionName));
                                }

                                
else
                                
{
                                    result.Add(
string.Format("{0},丢失事件:{1}",f,functionName));
                                }

                            }

                            objMatch
=objMatch.NextMatch();
                        }

                    }

                }

                finishFileNum
++;
            }

            
return result;
        }