防止刷新重复提交数据解决方法的分析

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

在Asp.net开发中,浏览器刷新重复触发事件,导致重复提交的问题,下面有几种解决方法,我针对适用情况和利弊做一个简单的分析。

方法一:检测数据表,看是否有相同的数据。这种方法对插入数据可能意义更大些,不过如何定义是相同的数据,是个麻烦的事。同时,如果不是插入数据,是删除呢,就不适用了。

方法二:提交后,转向一个过渡页面,然后再从过渡页面返回到当前的页面。这就要求在提交后,要把当前页面的URL地址作为参数传过去,同时不能保存缓存,否则“后退”带来不良后果。不过,如果是简单的删除,似乎转来转去太麻烦了。

方法三:用JavaScript捕捉F5事件。比如有如下代码:


window.document.onkeydown = KeyStroke;
function KeyStroke()
  {
   var key = event.keyCode;
   event.srcElement.releaseCapture();
   if(key == 116)
   {
   event.keyCode=0;
   event.returnValue=false;
   }
  }

似乎不错,禁用了F5,不过如果浏览器禁用了js咋办,如果用右键来刷新咋办?禁用右键么?不能为了实现一个功能来禁用这禁用那的,不合情理。

方法四:基于session和ViewState来处理。最好的例子见:http://cncxz.cnblogs.com/archive/2005/12/25/304141.html。这个方法的原理是"在页面代码执行的末尾将当前的ViewState写到一个Session中,而在页面加载时则判断该Session值是否与当前ViewState相等(其实Session值恰好是ViewState的前一状态),若不等,则是正常的postback,若是相等则是浏览器刷新".这个方法还不错,不过对session占用如此多的服务器资源,我有些担心。

方法五:用ajax提交操作。当然,这是从源头上就没有刷新的问题,因为postback都没有了,不存在防止刷新提交问题。有些偏题。

方法六:通过 HttpContext 对象传递给页面处理。这个方法是msdn给的一个方法,原理我就不赘述了,详见http://msdn.microsoft.com/zh-cn/library/ms379557(VS.80).aspx。我觉得这个方法不错,根据asp.net的运行机制来处理此问题,就比较游刃有余了。所以这个方法我推荐使用,虽然是msdn的这篇文章是2004年的老文了,现在看来依然很不错。

如果你觉得有其他更好的方法,不妨告诉我! :-)

本文首发地址:http://www.watch-life.net/aspnet/refresh-no-resubmit.html

更多文章见:守望轩[http://www.watch-life.net/]

你可能感兴趣的:(.net,Ajax,浏览器,asp.net,asp)