欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net防止刷新时重复提交(可禁用工具条刷新按钮)

程序员文章站 2024-03-05 14:22:45
前段时间遇到了需要禁用刷新的需求,f5按钮就不说了,简单的js就能把它禁用,但是工具条上的刷新按钮却傻傻干不掉。如果简单的在刷新时重新加载画面,通过window.locat...
前段时间遇到了需要禁用刷新的需求,f5按钮就不说了,简单的js就能把它禁用,但是工具条上的刷新按钮却傻傻干不掉。

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

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

private bool pagerefreshed = false; //页面是否刷新提交
private bool refreshstate = false; //viewstate中暂存的状态

然后重写page的loadviewstate与saveviewstate方法:
复制代码 代码如下:

protected override void loadviewstate(object savedstate)
{
object[] states = (object[])savedstate;
base.loadviewstate(states[0]);
refreshstate = (bool)states[1];
if(session["__page_refreshed"] == null)
pagerefreshed = false;
else
pagerefreshed = refreshstate != (bool)session["__page_refreshed"];
}
protected override object saveviewstate()
{
session["__page_refreshed"] = !refreshstate;
object[] states = new object[2];
states[0] = base.saveviewstate();
states[1] = !refreshstate;
return states;
}

复制代码 代码如下:

private void button1_click(object sender, eventargs e)
{
if (pagerefreshed )
{
label.text="this is refreshed function";
}
else
{
label.text="this is new request function";
}
}

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

2.codeproject找到了另外一种解决方法
这种方式能够准确的判断是否是通过浏览器的刷新按钮进行的请求,而且使用起来也非常简单!
1.引用dll,修改配置文件
在配置文件中添加modules
复制代码 代码如下:

<system.web>
<httpmodules>
<add name="refreshmodule"
type="refreshmodule.module, refreshmodule"/>
</httpmodules>
</system.web>

ps:wbapplication的情况下需要改成在system.webserver的modules的节点下追加modules
2.定义刷新时的行为
复制代码 代码如下:

[refresh()]
public partial class default : system.web.ui.page
{
protected void page_load(object sender, eventargs e)
{
if(ispostback && !refereshhelper.ispagerefreshed)
{
// do some work with the submitted date
}
else
{
// do some work when the page is loaded with the get method
}
}
}

refereshhelper.ispagerefreshed这个参数就是用来判断是否是通过浏览器的书刷新按钮进行的请求。其他的行为行为控制参照原文。ps:codeproject真是个不过的地方,很多问题都是通过它来解决的其他的方式不一一列举,列举的第二种方式可以说简单易用,所有的实现都已经为我们封装好了,只需要简单的调用。