Asp.net防止刷新重提交数据库操作

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Asp.net防止刷新重提交数据库操作

    最近在写个B/S的应用系统,采用Asp.net(2..0)+Windows验证+Ajax+Sql2005+VS2008+Windows2003的组合。
    由于我们对的是公司内部客户(两个财务部的小姑娘),做了几个输入界面就叫她们测试。
    发现新增数据或修改数据后刷新浏览器系统会重复前一次(最近一次的数据库操作)。
    这里将解决这个问题的解决方案和大家分享一下啊。

    我的思路是:
        上BaiDu上google上搜搜,但几种解决方案都不适合我的情况。
        网上的方案有:
            1、数据库操作后跳转回本页。
              即数据操作成功后:this.Page.Response.Redirect = "本页的URL";
              这个方案是可以防止刷新重提交数据库操作,但被财务的小姑娘否定了,原因是跳转到本页分页总是默认跳到第一页的,这样他看

不到刚刚输入的数据,要看的话还要翻到最后一页.
            2、用ViewState做标记
               提交后,ViewState["IsSubmit"]=false;
               这个根本不行的,因为ViewState["IsSubmit"]是利用HiddenField实现的,本身刷新时提交的数据是前一次的数据,因此

ViewState["IsSubmit"]也是前一次的值.
            3、用Session来做开关,这个也不行的,还是没办法判断人家是刷新还是重新提交的啊。
        没办法,以上办法都行不通的情况下,只有自己想解决方案。
        我的想法是:
          1、既然你是提交前次的数据,为我就要做下标记(要唯一的),但记录的值本身不能作为标记,因为完全有可能插入或修改一样的记录


          2、最后我决定我用一个HiddenField(ID为IsSubmit)记住这个标识.产生这个唯一值的方法是:

   //IsSubmit

     <asp:HiddenField ID="IsSubmit" runat="server" Value="0" />

  //插入
   <asp:Button ID="Button1" runat="server" CausesValidation="True"
                            CommandName="Insert" Text="插入" OnClientClick="javaScript:document.getElementById 

('IsSubmit').value=(new Date()).getTime()" />

//更新
<asp:Button ID="Button1" runat="server" CausesValidation="True"
                            CommandName="Update" Text="更新" OnClientClick="javaScript:document.getElementById

('IsSubmit').value=(new Date()).getTime()"/>
          说明下,上面作用是当插入和更新把HiddenField(ID为IsSubmit)的值赋值为系统当前的毫秒数(应该没办法在以毫秒内又提交又刷新

吧,而且这个值对一个Session理论上是永远唯一的啊).
         3、看我服务器端的动作(插入)
 protected void SqlDataSource3_Inserting(object sender, SqlDataSourceCommandEventArgs e)
    {
        if ("" + this.Session["LastSubmitID"] == "")
        {
            this.Session.Add("LastSubmitID", this.IsSubmit.Value);//如果这个Session不存在说明以前没提交过,肯定不是重复的,放行

,但要把this.IsSubmit.Value记载到this.Session["LastSubmitID"]中,以备下次比较

        }
        else
        {
            if ("" + this.Session["LastSubmitID"] == "" + this.IsSubmit.Value)//如果存在this.Session["LastSubmitID"]且与

this.IsSubmit.Value相等则说明是刷新的,因为刷新时是提交的上次的数据,this.IsSubmit.Value值当然也不会变,跳过数据操作
            {
                e.Cancel=true;
            }
            else//如果存在this.Session["LastSubmitID"]但与this.IsSubmit.Value不相等,说明是通过点击了插入或更新的数据操作,为正

常操作,放行,但要把这次的this.IsSubmit.Value记载到this.Session["LastSubmitID"]中,以备下次比较

            {
                this.Session["LastSubmitID"] = "" + this.IsSubmit.Value;
            }
        }       
      
    }
更新就不解释了,同理的
 protected void SqlDataSource3_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
        if ("" + this.Session["LastSubmitID"] == "")
        {
            this.Session.Add("LastSubmitID", this.IsSubmit.Value);

        }
        else
        {
            if ("" + this.Session["LastSubmitID"] == "" + this.IsSubmit.Value)
            {
                e.Cancel=true;
            }
            else
            {
                this.Session["LastSubmitID"] = "" + this.IsSubmit.Value;
            }
        }
}
   
      4、肯定又同志说了,每个数据库操作都要插入这样一大堆代码,太烦了啊.我们可以把验证是否正常提交写成一个方法来调用就不用这么

烦了啊.
       如:
          private bool CheckLastSubmitID()//验证是否正常提交
    {
        if ("" + this.Session["LastSubmitID"] == "")
        {
            this.Session.Add("LastSubmitID", this.IsSubmit.Value);
            return true;
        }
        if ("" + this.Session["LastSubmitID"] == "" + this.IsSubmit.Value)
        {
            return false;
        }
        else
        {
            this.Session["LastSubmitID"] = "" + this.IsSubmit.Value;
            return true;
        }
    }
上面的两个事件的代码换成:
protected void SqlDataSource3_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
            if(!CheckLastSubmitID())   
               {
                   e.Cancel=true;
                }
   }
protected void SqlDataSource3_Inserting(object sender, SqlDataSourceCommandEventArgs e)
    {
         if(!CheckLastSubmitID())   
               {
                   e.Cancel=true;
                }
    }
不烦了吧,哈哈。

水平有限,写的不好,请诸位博友见谅了啊。


        

 

   

基于ASP.NET的图片管理系统开发实战 在现代Web应用开发中,图片管理作为内容管理系统(CMS)和电商平台的核心模块之一,承担着用户上传、存储、展示与维护图像资源的要职责。ASP.NET作为一种成熟且功能强大的Web开发框架,凭借其稳定的运行机制、丰富的控件库以及与Windows生态的深度集成,成为构建企业级图片管理系统的理想选择。本章将从整体架构视角出发,系统阐述基于ASP.NET平台的图片管理系统的组成要素与技术选型逻辑。系统采用三层架构设计:表现层使用Web Forms快速构建UI界面; 阅读详情

相关推荐

Asp.Net防止刷新提交数据的办法

最近在用Asp.Net编写点东西时遇到个问题:即用户提交表单后按刷新就会提交数据,即所谓的“刷新提交”的问题。

ASP.NET 后退问题 .net 防止刷新 后退提交

原文 http://www.cnblogs.com/super-cj/archive/2012/11/07/2758472.html  让网页“立即过时”有时候是一个很有用的功能,比如防止用户使用后退来破坏程序逻辑;程序主动刷新某个页面等等。在ASP中最有效的方法是: Response.CacheControl = "no-cache" 就这么一句足矣,Response.Expires=-1...

weixin_33800463的博客 222

asp.net防止刷新提交

前段时间遇到了需要禁用刷新的需求,f5按钮就不说了,简单的js就能把它禁用,但是工具条上的刷新按钮却傻傻干不掉。 如果简单的在刷新新加载画面,通过window.location.href="url"可以很容易的实现,但是需求是要求在刷新时什么都不做,保留画面的状态,这下子可就复杂化了。 asp.net中分辨请求是新请求还是通过刷新按钮再次请求不是很方便,为了实现这个效果,试过了很多的方式...

weixin_30483697的博客 142

Asp.net实现弹出窗口提示,又防止刷新提交的方法

Response.Write("alert(弹出窗口!);window.location=a.aspx;");    比如在1.aspx页面上点按钮,弹出来一个提示窗口,同时又希望按F5刷新的时候,不要提交,这个时候,把上面这段代码写到按钮的click事件里,把a.aspx换成1.aspx页面就行了。    这里的方法实际上就是弹出窗口后新指向原来的页面,如果是用Response.R

要饭's Blog 3302

ASP.Net防止页面刷新提交

asp.net中页面刷新则会出现提交问题 解决方法一:提交完成后跳转至新页面 解决方法二:网站找的,代码如下 namespace StevenBey.Web.UI { public class Page : System.Web.UI.Page { private bool _refreshState; ...

weixin_34245169的博客 136

ASP.NET WebApi服务接口如何防止复请求

一、背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WebApi。在我们平时开发项目中可能会出现下面这些情况; 1)、由于用户误操作,多次点击网页表单提交按钮。由于网速等原因造成页面卡顿,用户刷新提交页面。黑客或恶意用户使用postman等工具复恶意提交表单(攻击网站)。这些情况都会导致表单提交,造成数据复,增加服务器负载,严甚至会造成服务器宕机。因此有效防止表单提交有一定的必要...

跟着阿笨一起玩NET 1572

ASP.NET WebApi服务接口如何防止复请求实现HTTP幂等性

一、背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WebApi。在我们平时开发项目中可能会出现下面这些情况; 1)、由于用户误操作,多次点击网页表单提交按钮。由于网速等原因造成页面卡顿,用户刷新提交页面。黑客或恶意用户使用postman等工具复恶意提交表单(攻击网站)。这些情况都会导致表单提交,造成数据复,增加服务器负载,严甚至会造成服务器宕机。因此有效防止表单提交有一定...

跟着阿笨一起玩NET 3668

ASP.NET WebForm 检测页面刷新(Refresh)

本文是翻译贴, 原文参见Detecting browser 'Refresh' from Code behind in C# 浏览器的"刷新"常会导致问题, 特别是当页面和数据库有交互的时候, 结果可能更糟. 因为, 每次页面刷新, 如果没有经过代码处理, 就会复做一次数据库操作. 这就可能导致数据的不一致, 甚至程序挂掉. 检测"刷新"的一种方法就是用JavaScript禁用掉...

a13643156647的博客 612

.net 防止刷新提交

http://www.cnblogs.com/madehua/archive/2009/03/23/1420052.html Code public class RefreshServe : System.Web.UI.Page { private static ILog log = LogManager.GetLogger(typeof(Refresh...

pmandy的专栏 123

防止后退提交

1、让提交后返回历史记录 Response.Write"<script>alert('OK!添加成功!');history.back();</script>" 2、提交后跳转到本页 response.redirect "index.asp" Response.Write"<script language=javascript>alert...

dianyan0163的博客 81

.net防止刷新提交(转)

net 防止提交 微软防止提交方案,修改版 CodepublicclassRefreshServe:System.Web.UI.Page{privatestaticILoglog=LogManager.GetLogger(typeof(RefreshServe));privatereadonlystri...

weixin_30527143的博客 151

WebForm中如何防止页面刷新,后退导致的提交

用户按下浏览器中的 F5 键刷新当前页面时,对这一过程进行检测所需的操作步骤。页面刷新是浏览器对特定用户操作(按 F5 键或单击“刷新”工具栏按钮)的响应。页面刷新操作是浏览器内部的一种操作,因为浏览器不会为事件或回调发出任何外部通知。从技术上讲,页面刷新是通过 “简单”复最新请求来实现的。换句话说,浏览器将缓存已处理的最新请求,并在用户单击页面刷新键时新发布已处理的请求。 正 是因为所有...

weixin_30420305的博客 636

ASP.Net防止页面刷新提交的几种方法

【摘要】 目前很多网站都要提交页面插入或更新数据库,比如留言本,一个用户提交留言后,如果按F5,就会提交一遍留言,导致数据库出现两条一模一样的留言,本文介绍了几种防止页面刷新,导致提交数据的方法。 【全文】 1、也是最简单和最常用的办法,就是使用转向页面语句,分两种: a.使用服务器端的 Response.Redirect("YourPage"); b.使用客户端脚...

weixin_30872157的博客 88

[翻译] ASP.NET MVC Tip #6 – 提交表单后如何进行定向

原文地址:http://weblogs.asp.net/stephenwalther/archive/2008/06/20/asp-net-mvc-tip-6-call-redirecttoaction-after-submitting-a-form.aspx 摘要:在这个Tip中,Stephen Walther介绍了当提交表单后如需定向,为何需要调用RedirectToAction方法进行...

weixin_34138521的博客 231

防止ASP.NET按钮多次提交的办法

方法一<asp:Button ID="btnSumbit" runat="server" UseSubmitBehavior="false" OnClientClick="this.value='Sumbit';this.disabled=true; " Text="Sumbit" OnClick="btnSumbit_Click" /> 方法二 1<htmlxmlns="...

weixin_30408309的博客 76

网页防刷新提交、防后退解决方法

document.form1.submit();后加document.body.innerHtml = " Waiting..."; //当然这里的html代码就由你发挥了,还可把这段写成函数,这样维护就方便了!这一处理,就让用户在等待提交时不会误以为没提交复按提交按钮! 防止网页后退--禁止缓存我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作

可克技术 831

.net验证码生成及使用

验证码的作用: 验证码是一个图片,将字母、数字甚至汉字作为图片的内容,这样一张图片中的内容用人眼很容易识别,而程序将无法识别。在进行数据库操作之前(比如登录验证、投票、发帖、回复、注册等等)程序首先验证客户端提交的验证码是否与图片中的内容相同,如果相同则进行数据库操作,不同则提示验证码错误,不进行数据库操作。这样各种机器人程序就被拒之门外了! 但是随着计算机科学的发展,模式识别等技术越来越成熟,...

qq_31897241的博客 343
上一篇: .net实现简繁体转换
下一篇: Sql 分布式查询格式资料
天涯海角
博客等级 码龄19年 392粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值