屏蔽刷新提交后台[转]

现象:当页面进行过数据提交(PostBack)后,如果通过点击【F5】或者浏览器的【刷新】按钮,

    此时页面会模拟浏览器的上次的提交事件,如果做的是数据插入操作,将有可能导致数据的多次插入。

原因:浏览器会模拟上次提交的数据在次提交,并在此触发上次提交的时间。

 

对策:

针对此,网上已经有各种各样的处理方法。大概有以下的两类:

1。通过在事件中,在插入数据之前做主键冲突判定。

2。在HttpHandler中添加票据处理,然后在事件处理中判断是否是刷新进行提交的。 

两种方法都需要对事件做特殊的处理,对于项目维护的复杂度有所增加,尤其是第一种需要做数据的逻辑判断,已经影响到了业务逻辑,这是很不好的方法。

 

  然而,我们是否可以让浏览器的刷新成为我们真正想要的刷新,即从新访问页面,而不是模拟上次的提交数据。

其实如果大家对第二种方式熟悉的话,他就是我们想要的方式,然而他需要每个页面的事件都做判断,因而维护程度较复杂,针对此本人做了一些改进。

 

具体修改方案如下:

 1.在页面中声明两个HiddenField,第一个存储前台页面的票据,第二存储后台Session票据的Key。

2.如果前台的票据和Session的票据不相同,则即为刷新,此时DeterminePostBackMode方法返回空,以使页面置为 非PostBack的状态。

3.在OnPreRenderComplete中同步HiddenField和Session中的票据。

详情见http://www.cnblogs.com/nabber/archive/2010/09/16/1828480.html

 

 1 using System;
 2  using System.Collections;
 3  using System.Configuration;
 4  using System.Data;
 5  using System.Linq;
 6  using System.Web;
 7  using System.Web.Security;
 8 using System.Web.UI;
 9 using System.Web.UI.HtmlControls;
10 using System.Web.UI.WebControls;
11 using System.Web.UI.WebControls.WebParts;
12 using System.Xml.Linq;
13 using DonkeyControl;
14 
15 
16 namespace WebTest
17 {
18     public partial class _Default : BasePage
19     {
20         protected void Page_Load(object sender, EventArgs e)
21         {
22             if (this.IsRefreshed)
23             {
24                 Label1.Text = "刷新";
25             }
26             else
27             {
28                 Label1.Text = "正常postback";
29             }
30         }
31     }
32 }
33 

posted on 2010-09-17 10:18  Chrisnda  阅读(151)  评论(0编辑  收藏  举报

导航