dinghao

记录成长点滴

 

asp.net的一个bug的发现和解决

   gridview中的按钮类型用如果用image,触发rowcommand事件时会被执行两次,据说只出现在IE6,IE5、firefox等没有问题,我的IE7也存在同样问题,似乎和IIS版本也有关系,期待微软的补丁。
   今天下午一遇到一个问题,gridview 的rowcommand事件会被执行两次,postback也会执行两次,最初还怀疑是调试器的问题,经过察看日志,确定真的被执行了两次。
   代码检查了n遍,逐句排除,仍没有找到问题,已经开始怀疑是鼠标了,抓包发现确实是发了两次请求,并且第一次请求没有被处理。偶尔一次把buttontype从image换到button,意外的好了,只被执行了一次,看来问题只出在Imagebutton。
   通过google搜索发现有不少人遇到了此问题,确定是asp.net的bug。点击按钮会向iis发两次请求,第一次比第二次少八个字节,导致第一次请求不成功,接着会重新发一次,因此最容易想到的就是忽略第一次请求,下面的第一种解决方式就是如此。
   目前有两个解决方案,都不完善,第一个是在rowcommand事件中加入下面的语句:
if (Request["x"== null && Request["y"== null)
            Response.End();
通过这条语句,判断图片的坐标,如果其坐标是null,则是第一次请求,因为第一次请求无效,结束他。
   第二个是微软推荐的:尽量不在gridview里面用imagebutton,而用link或者button,如果必须用可以用类似的代码:
<asp:GridView ID="GridView1" runat="server"> 
<Columns> 
<asp:TemplateField> 
<ItemTemplate> 
<asp:ImageButton runat=server id="ImageButton1" CommandName="Delete"
ImageUrl
="" commandargument='<%# DataBinder.Eval(Container,
"
RowIndex"%>' OnCommand="ImageButton1_Command" /> 
</ItemTemplate> 
</asp:TemplateField> 
</Columns> 
</asp:GridView> 

protected void ImageButton1_Command(object sender, CommandEventArgs e) {
GridView1.DeleteRow(Int32.Parse(e.CommandArgument.ToString())); 
}
 
把imagebuttong加入到TemplateField中,并且在事件中调用deleterow。
   不知道还有没有更好的解决方案,下面的论坛详细的讨论了这个问题:
http://www.developersdex.com/asp/message.asp?p=1116&r=4641456&page=2第一页讨论的结果是:只有在button的类型是image的情况下才会有此问题,可以略过不看,后面两页有详细的讨论和解决方式。
   今天一天一直在遇到奇怪问题,头大了,相同的代码经常一会可以执行,一会儿不可以,vs2005也一直出怪事。刚才把下午不能运行的几个问题在家模拟了一下竟然运行良好!!明天又要头痛了

posted on 2006-11-21 22:18 思无邪 阅读(2453) 评论(8)  编辑 收藏 网摘

评论

#1楼  2006-11-21 23:08 yunhuasheng      

有些地方挺值得参考.   回复  引用  查看    

#2楼  2006-11-22 10:02 God Blue Shadow      

肯定是你在后台代码中处理了Row_Command和Row Deleting事件了,因为Image Button有OnCommand方法,然后CommandName参数名又是Delete,所以会执行 Row Command和Deleting事件   回复  引用  查看    

#3楼  2006-11-22 11:30 RicCC      

是的,ImageButton、GridView等,就算不设置事件但如果CommandName设置成New、Delete等系统默认的一些,也会触发事件的,注意一下就可以避免   回复  引用  查看    

#4楼 [楼主] 2006-11-22 17:10 思无邪      

@RicCC
应该和commandname没有关系吧?我都仔细检查了代码。   回复  引用  查看    

#5楼 [楼主] 2006-11-22 17:14 思无邪      

@God Blue Shadow
没有用这些事件代码精简到只有rowcommand事件了
你说的可能指这中情况:
1、Correct behavior: as in the sample to the right. The AutoEventWireUp is set to true and the events are all set declaratively within the HTML markup
2、Correct behavior: as in the 2nd demo (link below) where the AutoEventWireUp is set to false and the event wireup is done programmatically by overriding the OnInit method
3、Incorrect behavior: as in 3rd demo (link below) where both the AutoEventWireUp and the overriding of the OnInit method are done to the same page. This causes the evnets to fire up twice.
其中第三种会触发两次,但是我遇到的说只有buttontype是image时才会触发两次
http://www.webswapp.com/codesamples/aspnet20/autoeventwireup/default.aspx
上面有详细的demo   回复  引用  查看    

#6楼  2006-11-28 13:21 BlueWave [未注册用户]

这问题我也碰到了,并不是每次都发生的,但是用了一个自己写的继承自GridView后就每次都发生了,不是rowcommand执行两次,而是页面彻底跑了两遍。我用的是IE6。

现在是这样解决的,

<asp:ButtonField CommandName="dt" HeaderText="Delete"
Text="&lt;img src=&quot;../../Images/delete.gif&quot; border=&quot;0&quot; title=&quot;delete&quot; onclick='return delete_click()' /&gt;">
<HeaderStyle Width="45px" />
</asp:ButtonField>
  回复  引用    

#7楼  2006-11-28 22:09 langlanglv [未注册用户]

我最近也遇到这个问题,我在imageurl设了个路径,第一次点击imagebutton不能触发图片页面的Page_Load,第二次点击就可以了,不知道应如何解决   回复  引用    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-11-21 23:25 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:
 

导航

统计

与我联系

搜索

 

常用链接

我参与的团队

随笔分类

随笔档案

收藏站点

文章收藏

积分与排名

最新评论

阅读排行榜