asp.net 防止刷新重复提交的代码(禁用工具栏刷新按钮 变灰)

发布时间:2019-08-19编辑:脚本学堂
如何用asp.net实现防止按刷新(f5)重复提交数据呢?要求刷新时,连工具栏上的刷新按钮也禁用,变成灰色,不能操作。

如何用asp.net实现防止按刷新(f5)重复提交数据呢?要求刷新时,连工具栏上的刷新按钮也禁用,变成灰色,不能操作。

下面为大家举二个例子,看看如何禁用刷新重复提交的问题。

一、方法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,按钮的不能执行。

二、另外一种方法
这种方式能够准确的判断是否是通过浏览器的刷新按钮进行的请求,使用也方便。

1.引用dll,修改配置文件
在配置文件中添加modules
 

复制代码 代码示例:
<system.web>
<httpModules>
<add name="RefreshModule"
type="RefreshModule.Module, RefreshModule"/>
</httpModules>
</system.web>
 

备注: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这个参数用来判断是否是通过浏览器的书刷新按钮进行的请求。