前段时间遇到了需要禁用刷新的需求,f5按钮就不说了,简单的js就能把它禁用,但是工具条上的刷新按钮却傻傻干不掉。

如果简单的在刷新时重新加载画面,通过window.location.href="url"可以很容易的实现,但是需求是要求在刷新时什么都不做,保留画面的状态,这下子可就复杂化了。

asp.net中分辨请求是重新请求还是通过刷新按钮再次请求不是很方便,为了实现这个效果,试过了很多的方式,一下面的两种为例

  1. private bool pageRefreshed = false; //页面是否刷新提交
  2. private bool refreshState = false; //ViewState中暂存的状态

然后重写Page的LoadViewState与SaveViewState方法:

  1. protected override void LoadViewState(object savedState)
  2. {
  3. object[] states = (object[])savedState;
  4. base.LoadViewState(states[]);
  5. refreshState = (bool)states[];
  6. if(Session["__PAGE_REFRESHED"] == null)
  7. pageRefreshed = false;
  8. else
  9. pageRefreshed = refreshState != (bool)Session["__PAGE_REFRESHED"];
  10. }
  11.  
  12. protected override object SaveViewState()
  13. {
  14. Session["__PAGE_REFRESHED"] = !refreshState;
  15. object[] states = new object[];
  16. states[] = base.SaveViewState();
  17. states[] = !refreshState;
  18. return states;
  19. }
  1. private void Button1_Click(object sender, EventArgs e)
  2. {
  3. if (pageRefreshed )
  4. {
  5. label.Text="this is refreshed function";
  6. }
  7. else
  8. {
  9. label.Text="this is new request function";
  10. }
  11. }

这种方法虽然能够实现,但是在某些请款下不适应。如果画面上同时存在文本框和按钮式,设置按钮的autopostback="True"时,在修改完文本框的值,直接点击按钮(在文本框没有失去焦点时,直接点击按钮),这时的执行顺序是textchanged→textchanged→buttonclick,在第一次textchanged时,就把状态已经变成了true,按钮的不能执行。

2.codeproject找到了另外一种解决方法 原文地址:http://www.codeproject.com/Articles/18841/Refresh-Module

这种方式能够准确的判断是否是通过浏览器的刷新按钮进行的请求,而且使用起来也非常简单!

ddl位置:http://files.cnblogs.com/linyijia/RefreshModule.rar

1.引用dll,修改配置文件

在配置文件中添加modules

  1. <system.web>
  2. <httpModules>
  3. <add name="RefreshModule"
  4. type="RefreshModule.Module, RefreshModule"/>
  5. </httpModules>
  6. </system.web>

PS:wbapplication的情况下需要改成在system.webServer的modules的节点下追加modules

2.定义刷新时的行为

  1. [Refresh()]
  2. public partial class Default : System.Web.UI.Page
  3. {
  4. protected void Page_Load(object sender, EventArgs e)
  5. {
  6. if(IsPostBack && !RefereshHelper.IsPageRefreshed)
  7. {
  8. // do some work with the submitted date
  9. }
  10. else
  11. {
  12.  
  13. // do some work when the page is loaded with the GET method
  14. }
  15. }
  16. }
  1. protected void Btn_AllAudit_Click(object sender, EventArgs e)
  2. {
  3. if (RefreshModule.RefreshHelper.IsPageRefreshed)
  4. {
  5. ScriptManager.RegisterStartupScript(this, this.GetType(), "", "alert('请别重复提交页面!');", true);
  6. return;
  7. }
  8. }

PS:如果是win7 使用本地IIS运行 需要把网站对应的程序池  基本设置里面 把集成模式 改成经典模式就可以了

asp.net防止刷新时重复提交的更多相关文章

  1. ASP.NET 使用Session,避免用户F5刷新时重复提交(转)

    1.使用Session,避免用户重复提交(F5刷新时) 0.起因         当用户上传文件后F5刷新浏览器会导致文件的重复提交和相关程序的重复执行.   1.实现原理         由于刷新提 ...

  2. PHP避免刷新页面重复提交

    PHP避免刷新页面重复提交 2013-07-09 15:27 匿名 | 浏览 3567 次 编程语言 情景:从html提交数据到x.php 在x.php中$_POST数据写库并且显示,当x.php刷新 ...

  3. PHP防止页面刷新、重复提交数据

    PHP防止页面刷新.重复提交数据 (2011-12-09 16:52:45) 转载▼ 标签: it 分类: php技术相关 闲来无事看了一下php session ,又在网上看了防止页面刷新重复提交数 ...

  4. php止刷新页面重复提交

    利用session来解决,首先新建一个session,并赋值,第一次提交后改变session的值,当第二次再此提交此内容时,如果不是我们的赋值,就不在处理传过来的数据.如:<?php sessi ...

  5. c#.net防止按F5刷新页面重复提交的方法

    在网上购物的过程中,提交完一个页面后,如果此时按f5刷新,则会弹出一个提示:如果继续,则会重新发送提交我们刚才提交的内容,这个问题应该规避掉,不然总是重复提交付款,那可不是件好事. 在c#.net中的 ...

  6. asp.net 禁用按钮防止重复提交

    按钮设置 1.OnClientClick属性为”this.disabled=true;“ 2.UseSubmitBehavior属性为”false“ 举例如下: <asp:Button ID=& ...

  7. 解决 php提交表单到当前页面,刷新会重复提交 的问题

    http://blog.csdn.net/u012466451/article/details/68952280

  8. 防止asp.net连续点击按钮重复提交

    1.在Page_Load中添加如下代码: protected void Page_Load(object sender, EventArgs e) { this.btnEdit.Attributes[ ...

  9. ASP.NET Web Form和MVC中防止F5刷新引起的重复提交问题

    转载 http://www.cnblogs.com/hiteddy/archive/2012/03/29/Prevent_Resubmit_When_Refresh_Reload_In_ASP_NET ...

随机推荐

  1. [AngularJS] Angular 1.3 ngAria - 2

    This is an highlight about ngAira in Angular Document abou ngAira Where can use ngAria? Currently, n ...

  2. 【ichartjs】用ichartjs替代Excel做直方图

    在 http://www.cnblogs.com/xiandedanteng/p/8717506.html 一文中,最后是用Excel作图,现在用ichartjs替代之. 效果如下: 文件下载: ht ...

  3. C语言 域名通配符实现

    本例实现通配符 * 的功能,不支持*在字符串的末尾, 仅提供思路,函数仅做简单单元测试. 如有使用,还请自己进行修改 // str1: 待匹配字符串 // str2: 带通配符字串 int wildc ...

  4. PHP快速入门 如何操作MySQL

    1 创建一个新的数据库,注意类型设置为utf8_general_ci 2 在数据库中创建一个新的表,比如叫做tg_user(先从左侧选择刚才创建的数据库) 3 创建第一个字段,自动编号.我们估计网站的 ...

  5. element-ui 源码学习

    https://athena0304.github.io/element-analysis/ 1.模板字符串实现字符串拼接 typeClass() { return `el-alert--${ thi ...

  6. xampp集成包如何重置mysql的密码

    转自:http://blog.sina.com.cn/s/blog_4b2bcac501013s4l.html 安装使用xampp,装好后root默认没有密码,phpmyadmin是用config文件 ...

  7. 金蝶K3,域环境中,无本地用户管理员权限的域用户如何设置注册表权限?

    如果该用户是属于Power Users组:只需要给用户添加注册表中的HKEY_LOCAL_MACHINE的SOFTWARE完全控制的权限.(勾选允许父项的继承权限和传播到该对象和所有子对象) 如果该用 ...

  8. Hadoop-1.2.1学习之Job创建和提交源码分析

    在Hadoop中,MapReduce的Java作业通常由编写Mapper和Reducer開始.接着创建Job对象.然后使用该对象的set方法设置Mapper和Reducer以及诸如输入输出等參数,最后 ...

  9. Loadrunner中影响"响应时间"的设置

    1.Runtime setting的设置 *Think time 这个就不多说了,如果忽略则"响应时间"会变短,但同时对服务器的压力增大,从而间接影响响应时间 在anlaysis里 ...

  10. EntityFramework~~~三种模式

    1:database-first 2:model-first 3:code-only 此处的code-only也就是大家叫的code-first,但是正确的叫法应该是code-only