当页面刷新的之后,在刷新前最后被执行的button事件会被执行。怎么能防止button事件的执行。(不是Page_Load的事,Page_Load里什么都不写也一样)

解决方案 »

  1.   

    判断一下是页面刷新还是button事件
      

  2.   

    要理解这个问题需要理解asp.net中控件的生命周期以控件的事件原理!我们知道对于标准的Form控件要实现IPostBackDataHandler和IPostBackEventHandler.这两个都是在PostBack才会引发的动作。当我们第一次请求页面的时候是不会做这两个动作的。但是当我们在页面上执行Button的时候,就会Submit   Form.(asp.net中Web   Button默认为Submit)。这个时候在服务器端通过Request.Form就会知道客户端的哪一个Button提交的,如果该Button有事件的话就会执行事件!   
              那么问题的关键在于:为什么我们刷新一下页面也会再次的执行Button事件呢?这就要理解在刷新的时候我们是以什么方式提交页面的(实际是Post),那么服务器就会得到并会继续的执行Button事件!并不管是否IsPostBack!   
              通过ieHttpHeaders,我们可以看到第一次请求页面的时候,ViewState什么也没有,当我们执行Button的时候的ViewState是__VIEWSTATE=dDw5NjU1MTU1Ozs%2BqpNxXAVt5su06O7aeRq%2FofRHPlc%3D&Button1=Button   
              我们刷新页面的时候提交的页面数据是:POST   /WebApplication1/WebForm1.aspx   HTTP/1.1   
      Accept:   */*   
      Referer:   http://localhost/WebApplication1/WebForm1.aspx   
      Accept-Language:   zh-cn   
      Content-Type:   application/x-www-form-urlencoded   
      Accept-Encoding:   gzip,   deflate   
      User-Agent:   Mozilla/4.0   (compatible;   MSIE   6.0;   Windows   NT   5.1;   SV1;   .NET   CLR   1.1.4322;   .NET   CLR   2.0.40607)   
      Host:   localhost   
      Content-Length:   77   
      Connection:   Keep-Alive   
      Cache-Control:   no-cache   
      Cookie:   ASP.NET_SessionId=lq0lprva5203xfv33jw3r155   
        
      __VIEWSTATE=dDw5NjU1MTU1Ozs%2BqpNxXAVt5su06O7aeRq%2FofRHPlc%3D&Button1=Button   
      看,这里还是有Button。   
      所以事件继续执行!   
      那么,有没有办法禁止他这样呢?可以用javascript来做到这一点:
          用javascript来控制的方法就是截取F5或者刷新按钮。这个时候将form的method改为get而非post。模拟一个新的请求! 
        
      

  3.   

    protected void button1_click( ... )
    {
       //重定向本页
    }
      

  4.   

    用Response.Redirect("thispage.aspx")重定向有一定的局限性,有的时候不适合。
    我现在正找怎样用javascript来控制的方法就是截取F5或者刷新按钮。将form的method改为get而非post。模拟一个新的请求!
    在form的属性来直接改: <form id="form1" runat="server" method ="get">没有效果............请大家帮忙!
      

  5.   

    你可以试着调试下,页面上只放一个botton他的事件里放断点,然后调试,刷新,点击button后再刷新,看看代码运行的顺序。
      

  6.   

    可以获得刷新事件:
    <script   language="javascript">   
      function   window.onbeforeunload()   {   
          if(event.clientX>document.body.clientWidth&&event.clientY<0||event.altKey)   
          {   
                  }else   {   
              alert("你在刷新")   
          }   
      }   
        
        
      </script>
      

  7.   

      function   window.onbeforeunload()   {   
          if(event.clientX>document.body.clientWidth&&event.clientY<0||event.altKey)   
          {   
           }
           else 
          {   
              alert("你在刷新");
              document.form1 .method ="get";   
          }   
      } 
    也不顶用,而且是回传事件就会出发......
      

  8.   

    protected   void   button1_click(   ...   ) 

          //重定向本页 
    }
      

  9.   

    楼太多,没看完
     凭自己的感觉
    可能是在刷新前button事件已经执行了
     只是你没重新绑定
    所以再次刷新页面的时候会把执行结果显示出来
     如果是这种情况把button事件自己绑定一次就OK了
      

  10.   

    楼太多,没看完 
      凭自己的感觉 
    可能是在刷新前button事件已经执行了 
      只是你没重新绑定 
    所以再次刷新页面的时候会把执行结果显示出来 
      如果是这种情况把button事件自己绑定一次就OK了

    弄错了,认真学习...
      

  11.   

    在执行完Button事件的最后一句加上:Response.Write("<script>history.go(-1);</script>"); 
    这样按刷新按钮,右键或者F5都不执行事件里的Code了.
      

  12.   

    Response.Write(" <script> history.go(-1); </script> ");  
    跟重定向页面差不多,有些数据显示不了。我这有篇文章,不过调试老有错误要不就异常。大家看看:本文前面讨论的机制可以预处理请求,并确定是否正在刷新页面。这些信息通过 HttpContext 对象传递给页面处理程序。在页面中,开发人员可以使用以下代码检索这些数据。bool isRefresh = (bool) HttpContext.Current.Items["IsPageRefreshed"];
    但更好的做法是,如果使用自定义的、更有针对性的 Page 类,则可以将数据封装到一个更易于使用的属性中,即封装到 IsPageRefresh 属性中。public bool IsPageRefresh {get {object o = HttpContext.Current.Items[RefreshAction.PageRefreshEntry];if (o == null)return false;return (bool) o;   }}
    通过使 Page 类继承新的、功能更丰富的基础类(本例中为 Msdn.Page),可以通过新属性了解发出请求的真正原因。以下示例显示了如何实现不应在页面刷新时重复的某个关键操作。void AddContactButton_Click(object sender, EventArgs e) {if (!IsPageRefresh)AddContact(FName.Text, LName.Text);BindData();TrackRefreshState();}
    仅当在不刷新页面时才添加新联系人,换句话说,仅当用户按照常规方式单击“Add-Contact”(添加联系人)按钮时才会添加联系人。上述代码片断中有一个很奇怪的 TrackRefreshState 方法,它的作用是什么呢?该方法更新票证计数器,并确保新页面响应包含带有最新票证的隐藏字段。在本例中,通过将会话状态中存储的值递增一来获取下一个票证。(这里只是随便使用了会话状态,最好不要使用会话状态,而使用更具扩展性的提供程序模型,就像在 ASP.NET 2.0 中一样。)但是,关于 TrackRefreshState 方法(这是有意命名的,以便于大家回想起更熟悉的 TrackViewState 方法),主要有一点要说明。通过调用该方法,除了可以添加其他信息外,还可以将带有当前请求票证的隐藏字段添加到页面响应中。如果没有隐藏字段(参见图 1),刷新机制将无法检测下一个回发是刷新还是提交。换句话说,通过在回发事件处理程序中调用 TrackRefreshState,使得系统知道您要跟踪该操作(而且只跟踪该操作),以确定是否为页面刷新。这样,您只跟踪可能会出错的页面刷新,而且并不是所有页面刷新都会在会话生命周期内发生。要利用页面刷新功能,只需在 Microsoft Visual Studio .NET 项目中添加一个新页面,然后打开内含代码文件并将页面的基础类更改为 Msdn.Page。接下来,在您执行不应刷新的操作时调用 TrackRefreshState(Msdn.Page 类的新的公共方法)。使用新的布尔属性 IsPageRefresh 检查刷新状态。
      

  13.   

    msdn 有讲关于这方面的文章,下面是文章链接:(不过看着太繁)
    http://msdn2.microsoft.com/zh-cn/library/ms379557(VS.80).aspx
      

  14.   

    当button按钮事件触发后,不要求页面刷新怎么办