今天做网站时遇到了非常恶心的事:
页面上有两个用户控件,其中一个包含ListView,用于显示商品评论列表,另一个就是用于发表评论的提交信息界面。
用于显示评论列表的用户控件中的ListView支持编辑模式,用于楼主回复评论,大体是这样的:
诡异的就是提交回复的时候有时会触发下面那个发表评论的的用户控件的验证,这样下面的发表控件提示没输入内容、验证码之类的,这边的提交也被取消。
我把两个控件中的所有验证控件和按钮都各自分组,然后把ListView中的所有按钮的CausesValidation属性都设为False,即不触发任何验证,再试,问题仍然存在。
而且奇怪的是同样的操作、同样的环境,这个问题却是有时会出现,有时不会,往往前一次成功了,立即再执行一次就出错,而出错的几率比较高。
研究了好半天,始终找不到问题在哪,我没有任何主动触发验证的代码,后来我将Page.Validate()方法重写,并为其设置断点监测:
果然点击提交之后,经常是执行完页面及控件的所有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
这里明确说是“在 ASP.NET 2.0 中,控件不再调用 Page.Validate() 方法”,咱这ListView都是3.5的控件了吧?为什么这里还频频被调用?
为了证明不是自己网站内的某段代码产生的副作用,我创建了一个空白网站项目,在默认页中只加了一个ListView:
然后按上面的方法重写Validate()并设置断点,测试:
又跑到Validate()里去了:
这个测试与之前不同的是:每次点更新都肯定跑到这里来,并且从未执行过ListView1_ItemUpdating一次,Validate()完了就直接返回给客户端了~~更加迷惑中……
页面上连一个需要验证的控件都不存在,为什么会这样呢??
我还是将所有按钮的CausesValidation属性都设为False,并为它们分配一个验证组,也无济于事。
那么再来测试一下其他控件或页面本身是否存在这种问题吧,我新建了个页面,放入一个按钮和下拉列表:
为它们各自分配了回发事件,然后还是重写Validate()并设置断点:
经测试,无论怎么折腾也不会触发到Validate()方法,这就说明常规控件确实不会触发这个破方法了。
测试网站项目源码下载:http://cid-0612298d2255e149.skydrive.live.com/self.aspx/.Public/文档/WebApplication520090628191058.rar
到底是什么愿意致使ListView触发已该废弃的Validate()方法?
又是什么原因导致它在回发时随机触发?(- -难道要用薛定谔方程来控制~)
为何将所有验证控件都设为通过后,或根本没有验证控件时,执行了此方法后仍然不按正常流程继续执行回发事件?
这破玩意都快让我吐血了,反复无常,没有规律,恶心死我了,求高手解答一下原理,或者有什么办法禁止ListView执行Validate()吧~
(注:我的ListView都未绑定数据源,是自己实现各种操作逻辑的,参考的这篇文章)
转载请遵循此协议:署名 - 非商业用途 - 保持一致
并保留此链接:http://skyd.cnblogs.com/