asp.net 防止刷新重复提交的代码(禁用工具栏刷新按钮 变灰)
本文导语: 如何用asp.net实现防止按刷新(f5)重复提交数据呢?要求刷新时,连工具栏上的刷新按钮也禁用,变成灰色,不能操作。 下面为大家举二个例子,看看如何禁用刷新重复提交的问题。 一、方法1 代码示例: private bool pageRefreshed =...
如何用asp.net实现防止按刷新(f5)重复提交数据呢?要求刷新时,连工具栏上的刷新按钮也禁用,变成灰色,不能操作。
下面为大家举二个例子,看看如何禁用刷新重复提交的问题。
一、方法1
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
备注:wbapplication的情况下需要改成在system.webServer的modules的节点下追加modules
2.定义刷新时的行为
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这个参数用来判断是否是通过浏览器的书刷新按钮进行的请求。