Jeffrey&Lynny

一个温馨小家庭的.Net生活

导航

How to workaround the IE default behavior of re-posting the entire form when pressing "刷新"(or F5)

问题描述:
IE会在发送过一个Http Post请求到服务器端之后(比如点击一个Asp.net的Button按钮),如果点击"刷新"按钮,IE将会弹出"retry"的对话框,对于点击"retry",IE会将前面第一次的HTTP请求再发送到服务器端。造成了Button.Click连续两次执行。
============================================================
解决方案:
对于这个问题,通常的解决方法是改Http Post请求为Http Get请求而使用QueryString,但是这样做的话会打乱Asp.net的编程对象模型。这里我提供一个方法:

通过Network Monitor发现,IE发送的重复请求里面会将第一次Http Post请求发送一遍,这里关键在于它总是发送"第一次"已经发送过的Http Post请求,所以,如果我们在前面的请求中写一些信息到ViewState中,这些新的ViewState信息并不会被Post到服务器端。这样,我们可以利用这个特性在Session里面写入与ViewState相同的信息,然后比较ViewState和Session的异同,如果不同了,说明是一个冗余的刷新请求了。示例代码如下:

private void Button1_Click(object sender, System.EventArgs e)
{
 int SessionTimes;
 int ViewTimes;
 if(this.Session["SubmittedTimes"] ==null)
 {
  SessionTimes = 0;
 }
 else
 {
  SessionTimes = (int)Session["SubmittedTimes"];
 }

 if(this.ViewState["SubmittedTimes"] ==null)
 {
  ViewTimes = 0;
 }
 else
 {
  ViewTimes =(int)ViewState["SubmittedTimes"];
 }
 if(ViewTimes == SessionTimes) 
 {
  //if they are not equal, it's refresh put your code for inserting a new record here.
 }
 SessionTimes = SessionTimes + 1;
 ViewState["SubmittedTimes"] = SessionTimes;
 Session["SubmittedTimes"] = SessionTimes;
}

posted on 2004-10-25 11:23  比尔盖房  阅读(692)  评论(0编辑  收藏  举报