GridView rowcommand调用两次的bug

本文探讨了ASP.NET中GridView的ImageButton在特定浏览器下触发两次rowcommand事件的问题,提供了两种解决方法并分析了原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

GridView rowcommand调用两次的bug - 花花 - 我的太阳
把imagebuttong加入到TemplateField中,并且在事件中调用deleterow。
   不知道还有没有更好的解决方案,下面的论坛详细的讨论了这个问题:
http://www.developersdex.com/asp/message.asp?p=1116&r=4641456&page=2第一页讨论的结果是:只有在button的类型是image的情况下才会有此问题,可以略过不看,后面两页有详细的讨论和解决方式。
  ms的东西包装了太多,用起来实在不爽~~早知道一开始就应该用纯的html页面写了,这虽然麻烦点,但是可控性大很多,哎~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值