【附视频】万分诡异!——ListView胡乱执行Page.Validate()的BUG

简介:

image

今天做网站时遇到了非常恶心的事:

页面上有两个用户控件,其中一个包含ListView,用于显示商品评论列表,另一个就是用于发表评论的提交信息界面。

用于显示评论列表的用户控件中的ListView支持编辑模式,用于楼主回复评论,大体是这样的:

image

诡异的就是提交回复的时候有时会触发下面那个发表评论的的用户控件的验证,这样下面的发表控件提示没输入内容、验证码之类的,这边的提交也被取消。

我把两个控件中的所有验证控件和按钮都各自分组,然后把ListView中的所有按钮的CausesValidation属性都设为False,即不触发任何验证,再试,问题仍然存在。

而且奇怪的是同样的操作、同样的环境,这个问题却是有时会出现,有时不会,往往前一次成功了,立即再执行一次就出错,而出错的几率比较高。

研究了好半天,始终找不到问题在哪,我没有任何主动触发验证的代码,后来我将Page.Validate()方法重写,并为其设置断点监测:

image

果然点击提交之后,经常是执行完页面及控件的所有Load函数后,就去执行它,而不是执行ListView1_ItemUpdating事件,但如前所述,这种情况的出现还是不确定的,有时就能顺利的去执行ListView1_ItemUpdating事件,我频繁地进行了连续测试,其结果仍然是不确定的。

这是测试视频:

清晰版本下载:http://cid-0612298d2255e149.skydrive.live.com/self.aspx/.Public/文档/2009-6-28%2016-38-00.wmv

而即使这样重写Validate()方法也没用:

public override void Validate()
{
    foreach (IValidator f in this.Validators)
    {
        f.IsValid = true;
    }
}

依然是回发时随机触发该方法,执行完Validate()也还是不会执行ListView1_ItemUpdating事件。

(上面视频里你或许注意到有一个规律:同一条目修改到第二遍准出错,但是当我像上面那样重写该方法后再做测试时,这个规律荡然无存,可说是完全随机了……难道这就是传说中的量子的不确定性?!?!?

清晰版本下载:http://cid-0612298d2255e149.skydrive.live.com/self.aspx/.Public/文档/2009-6-28%2018-21-12.wmv

这里没设断点,如果执行到Validate()还是不会完成提交,页面会跳到下面去(大概是因为下面有验证控件,但不知道为什么不显示错误提示)

 

在网上搜啊搜,也没找到什么有帮助的内容,好像这位老老兄也在无解中,不过看到MSDN有这么个说法:

http://msdn.microsoft.com/zh-cn/library/0ke7bxeh.aspx 

image

这里明确说是“在 ASP.NET 2.0 中,控件不再调用 Page.Validate() 方法”,咱这ListView都是3.5的控件了吧?为什么这里还频频被调用?

 

为了证明不是自己网站内的某段代码产生的副作用,我创建了一个空白网站项目,在默认页中只加了一个ListView:

image

然后按上面的方法重写Validate()并设置断点,测试:

image 

又跑到Validate()里去了:

image

这个测试与之前不同的是:每次点更新都肯定跑到这里来,并且从未执行过ListView1_ItemUpdating一次,Validate()完了就直接返回给客户端了~~更加迷惑中……

页面上连一个需要验证的控件都不存在,为什么会这样呢??

我还是将所有按钮的CausesValidation属性都设为False,并为它们分配一个验证组,也无济于事。

 

那么再来测试一下其他控件或页面本身是否存在这种问题吧,我新建了个页面,放入一个按钮和下拉列表:

image

为它们各自分配了回发事件,然后还是重写Validate()并设置断点:

image

经测试,无论怎么折腾也不会触发到Validate()方法,这就说明常规控件确实不会触发这个破方法了。

 

测试网站项目源码下载:http://cid-0612298d2255e149.skydrive.live.com/self.aspx/.Public/文档/WebApplication520090628191058.rar

 

到底是什么愿意致使ListView触发已该废弃的Validate()方法?

又是什么原因导致它在回发时随机触发?(- -难道要用薛定谔方程来控制~)

为何将所有验证控件都设为通过后,或根本没有验证控件时,执行了此方法后仍然不按正常流程继续执行回发事件?

这破玩意都快让我吐血了,反复无常,没有规律,恶心死我了,求高手解答一下原理,或者有什么办法禁止ListView执行Validate()吧~

(注:我的ListView都未绑定数据源,是自己实现各种操作逻辑的,参考的这篇文章


本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2009/06/29/1512900.html,如需转载请自行联系原作者

相关文章
|
4月前
|
前端开发
修正一些formdesigner的一些bug与操作
修正一些formdesigner的一些bug与操作
33 1
‘pageNum‘ is declared but its value is never read.Vetur(6133,点击跳转页面也跳转视频敲代码不要着急,往后看看,再跟着敲敲说不定bug就解决了
‘pageNum‘ is declared but its value is never read.Vetur(6133,点击跳转页面也跳转视频敲代码不要着急,往后看看,再跟着敲敲说不定bug就解决了
|
2月前
|
存储 数据库
cannot read properties of underfined (reading ‘code‘),别光知道抄,有的时候,细节就是影响全局关键,别人代码到你项目不一定100%正确,判断bug出
cannot read properties of underfined (reading ‘code‘),别光知道抄,有的时候,细节就是影响全局关键,别人代码到你项目不一定100%正确,判断bug出
|
3月前
|
SQL 前端开发
一篇文章讲明白IPage使用大概
一篇文章讲明白IPage使用大概
54 0
|
4月前
踩坑——使用了dispatchTouchEvent后控件点击无效问题
踩坑——使用了dispatchTouchEvent后控件点击无效问题
27 0
|
11月前
|
人工智能 自然语言处理 语音技术
pull错代码,恢复到pull之前 ---本地代码回退
pull错代码,恢复到pull之前 ---本地代码回退
119 0
|
前端开发 开发者
will-change 属性细节太多了,一般人玩不好
will-change 被定义为浏览器最后的优化手段,它的作用是告诉浏览器,这个元素将要发生变化,浏览器可以提前做一些准备工作,当元素发生变化时,浏览器就不需要再做一些额外的工作,从而提高性能。
212 0
will-change 属性细节太多了,一般人玩不好
|
前端开发 JavaScript 小程序
面试被问ReadOnly和Disabled的区别问题,千万别这样答!
20分钟前,淘汰了一个工作4年的前端。 面试前,HR对他极力赞扬。从简历上看, Vue.js ,React ,JavaScript ,HTML,再到CSS都有涉及,跨平台PC、移动端、小程序也都接触过!
|
XML 安全 数据格式
测试妹子提了个bug,为什么你多了个options请求?
对于简单请求来说,如果请求跨域,那么浏览器会放行让请求发出。浏览器会发出cors请求,并携带origin。此时不管服务端返回的是什么,浏览器都会把返回拦截,并检查返回的response的header中有没有Access-Control-Allow-Origin是否为true,说明资源是共享的,可以拿到。如果没有这个头信息,说明服务端没有开启资源共享,浏览器会认为这次请求失败终止这次请求,并且报错。
193 0
测试妹子提了个bug,为什么你多了个options请求?
|
Java 应用服务中间件 Docker
同事嫌我改Bug慢,原来是没掌握这些代码Debug技巧
代码Debug调试是研发工程师日常工作中必不可少的重要组成部分。进行代码Debug调试的目的无非就两个,一个是自我检查代码逻辑是否有问题,便于自己将Bug消灭在测试介入之前;另一个是进行线上问题排查定位,找到实际在跑业务的过程中出现的Bug。
同事嫌我改Bug慢,原来是没掌握这些代码Debug技巧