• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > Asp.Net防止刷新重复提交数据的办法

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了asp.net,asp net培训,asp和asp.net的区别,零基础学asp.net,c#和asp.net的区别等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在网上搜 一下,可以找到很多关于这方面的资料,其中有一篇是来自MSDN上的一种解决方法: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/BedrockASPNET.asp 它是通过重新定义 System.Web.UI.Page 类来实现加载页面时,是“刷新”、“后退”请求,还是正常请求,其他的页面则继承了自定义的这 个Page类。感觉他这个方法比较独特,有例子可以下载,有兴趣的可以研究研究。

网上最多的解决此类问题的方法就是不保存缓存,即提交后表单上的数据不会被浏览器的缓存保存,如果此时再遇到刷新或者后退请求时, 就会显示“网页已过期”,数据也就不会重复提交了,这就起到了阻止刷新重复提交的效果。

下面以简单的提交一篇帖子为例,介绍禁用缓存防止刷新重复提交的方法,表单数据包括“标题”和“正文”两个部分。

以下是该方法的代码(post.aspx):

protected void Page_Load(object sender, EventArgs e)

{

   //可以在页面加载时设置页面的缓存为“SetNoStore()”,即无缓存

   Response.Cache.SetNoStore();

   //Session中存储的变量“IsSubmit”是标记是否提交成功的

   if ((bool)Session["IsSubmit"])

   {

     //如果表单数据提交成功,就设“Session["IsSubmit"]”为false

     Session["IsSubmit"] = false;

     //显示提交成功信息

     ShowMsg.Text = " * 提交成功!";

   }

   else

     //否则的话(没有提交,或者是页面刷新),不显示任何信息

     ShowMsg.Text = "";

}

//提交按钮(btnOK)单击事件

protected void btnOK_Click(object sender, EventArgs e)

{

   if (txtTitle.Text.ToString().Trim() == "")

     //ShowMsg是用来显示提示信息的

     ShowMsg.Text = " * 标题不能为空!";

  else if (txtText.Text.ToString().Trim() == "")

     ShowMsg.Text = " * 内容不能为空!";

  else

   {

     //这里是将数据提交到数据库中,省略

     /*

     string sql = "insert into tab...values(...)";

     MyConn.ExecQuery(sql);

     */

     //提交成功后,设“Session["IsSubmit"]”为true

     Session["IsSubmit"] = true;

     //强制转换页面(不可少,否则刷新仍会重复提交,仍转到本页),

     通过页面的转换将缓存中的提交的数据都释放了,即提交的标单数据不会被保存到缓存里,

     如果后退的话,将会出现该页无法显示

     Response.Redirect("post.aspx");

  }

}
</div>
上面这个方法非常简单也很实用,推荐大家使用。

下面是我自己研究出来的另一种方法,该方法不同于“不保存缓存的方法”,它是让浏览器保存所有页面缓存的。该方法通过随机码的方式 来判断是正常提交还是“刷新”或“后退”的。

首先(提交页面是post.aspx)在 Session 中 增加变量 Rnd 用来存放随机码,同时在提交表单数据时不做处理,而是让页面转到 post.aspx?r=x,这里“x”等于Session["Rnd"],这个时候在页面加载时,通过判断r的值和Session["Rnd"]的值是否相同,如果相同就处理提 交的数据,否则即可认为是“刷新”或者是“后退”操作了,最后再次付给Session["Rnd"]一个随机码。

以下是该方法代码(post.aspx):

public class MyRnd

{

   public static string Rnd()

   {

     //随机码是由 0-9 a-z A-Z 之间的数字或字母组成的

     //下面是生成的20位随机码

     //0..9 A..Z a..z

     //48-57 65-90 97-122

     string rst = "";

     Random rr = new Random();

     for (int i = 0; i < 20; i++)

     {

       int ir = 0;

       do

       {

         ir = rr.Next(123);

         if((ir >= 48) && (ir <= 57)) break;

         else if((ir >= 65) && (ir <= 90)) break;

         else if ((ir >= 97) && (ir <= 122)) break;

       }

       while (true);

       rst += ((char)ir).ToString();

       }

     return rst;

   }

}

//页面加载

protected void Page_Load(object sender, EventArgs e)

{

   //获取URL中请求的“r”值,如果“r”不存在则 r=""

   string r = "";

   if(Request.QueryString["r"] != null)

     r = Request.QueryString["r"].ToString().Trim();

   string t;

   //获取 “Session” 中的 “Rnd” 值,用于和“r”比较

   t = Session["Rnd"].ToString().Trim();

   //如果“r=t”则为提交操作,即可对表单的数据进行处理

  if(r == t)

  {

     if (txtTitle.Text.ToString().Trim() == "")

       ShowMsg.Text = " * 标题不能为空!";

     else if (txtText.Text.ToString().Trim() == "")

       ShowMsg.Text = " * 内容不能为空!";

     else      {

       //这里是将数据提交到数据库中,省略

       /*

       string sql = "insert into tab...values(...)";

       MyConn.ExecQuery(sql);

       */

       //提交成功后清空表单数据

       txtTitle.Text = "";

       txtText.Text = "";

       //显示提交成功信息

       ShowMsg.Text = " * 提交成功!";

     }

  }

   //否则可以认为是“刷新”或者“后退”操作

   else

   {

       txtTitle.Text = "";

       txtText.Text = "";

  }

  //最后要重新获得“Session["Rnd"]”的值,并将“btnOK.PostBackUrl”设为“Session["Rnd"]”的值

  Session["Rnd"] = MyRnd.Rnd();

  btnOK.PostBackUrl ="post.aspx?r=" + Session["Rnd"].ToString().Trim();

}

//这里提交按钮(btnOK)单击事件就不需要写任何代码了
</div>
通过这种方法,每次加载页面时“Session["Rnd"]”都将得到一个新的值,而在刷新或后退时就不会得到相同的“r”和“t”值,数据也就 不会被重复提交,只有通过“btnOK”来提交的操作才会得到“r==t”,数据才会被提交处理的,通过判断随机码的方式来阻止刷新重复提交就 可以实现了。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Asp.net SignalR 应用并实现群聊功能 开源代码
  • asp.net动态更新
  • asp.net利用母版制作页脚效果
  • Asp.Net服务器发送HTTP标头后无法设置内容类型的问题解决
  • 使用asp.net mvc,boostrap及knockout.js开发微信自定义菜单编辑工具(推荐)
  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET Core发送邮件的方法
  • 在ASP.NET Core 中发送邮件的实现方法(必看篇)
  • ASP.NET MVC从视图传参到控制器的几种形式
  • Asp.net core WebApi 使用Swagger生成帮助页实例

相关文章

  • 2017-05-11asp.net利用后台实现直接生成html分页的方法
  • 2017-05-11在ASP.NET 2.0中操作数据之四十四:DataList和Repeater数据排序(三)
  • 2017-05-11在Asp.net下实现变长连接的web即时应用的实现范例及ReverseAjax的演示介绍
  • 2017-05-11ASP.NET实现上传Excel功能
  • 2017-05-11asp.net生成静态页并分页+ubb第1/2页
  • 2017-05-11ASP.NET 回发密码框清空问题处理方法
  • 2017-05-11jQuery Data Linking 对象与对象之间属性的关联
  • 2017-05-11asp.net读取excel中的数据并绑定在gridview
  • 2017-05-11C#数据导入/导出Excel文件及winForm导出Execl总结
  • 2017-05-11.net jMail邮件发送(含抄送、密送、多发、日志记录)实例代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • asp.net datalist 用法
    • asp.net使用for循环实现Datalist的分列显示功能
    • .NET发布网站详细步骤
    • ASP.NET操作MySql数据库的实例代码讲解
    • 在ASP.NET 2.0中操作数据之三:创建母版页和站点导航
    • 三步将Asp.Net页面输出到EXCEL里
    • 浅析GridView中显示时间日期格式的问题
    • ASP.NET如何定时调用WebService服务
    • asp.net传多个值到其它页面的具体实现
    • ASP.NET中 TextBox 文本输入框控件的使用方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有