Posted on 2008-07-17 23:40
xujh 阅读(2764)
评论(26) 编辑 收藏 网摘 所属分类:
ASP.NET
Feedback
<asp:Button ID="btnSumbit" runat="server" UseSubmitBehavior="false" OnClientClick="this.value='Sumbit';this.disabled=true; " Text="Sumbit" OnClick="btnSumbit_Click" />
用这个方法比较好,防止多次提交。
不错,我AJAX的时候,disable 在传出数据则 true 回调完成之后才 false.刷新,刷新后 input 自然是空值,提交数据前肯定要检测的,空值就传不上数据了。
如果是PostBack机制,这样防是远远不够的。不信,你提交后刷新页面试试。
function mykeydown()
24 {
25 if(event.keyCode==116) //屏蔽F5刷新键
26 {
27 window.event.keyCode=0;
28 return false;
29 }
30 }
如果不能屏蔽菜单栏或反键中的刷新,有何意义?
--引用--------------------------------------------------
amingo: function mykeydown()
24 {
25 if(event.keyCode==116) //屏蔽F5刷新键
26 {
27 window.event.keyCode=0;
28 return false;
29 }
30 }
如果不能屏蔽菜单栏或反键中的刷新,有何意义?
--------------------------------------------------------
谢谢,我的这个代码主要还是防止操作人员误操作。
--引用--------------------------------------------------
JuzzPig: 如果是PostBack机制,这样防是远远不够的。不信,你提交后刷新页面试试。
--------------------------------------------------------
谢谢,PostBack后就可以进入服务端代码的控制中了,我这个范例中要求关键项必须填写才可以通过,在服务端处理并返回新的页面前可以通过清除关键输入项来使得刷新也无法进行后续处理。
--引用--------------------------------------------------
大李:
用这个方法比较好,防止多次提交。
--------------------------------------------------------
谢谢大李,你这个方法更好。
--引用--------------------------------------------------
大李: <asp:Button ID="btnSumbit" runat="server" UseSubmitBehavior="false" OnClientClick="this.value='Sumbit';this.disabled=true; " Text="Sumbit" OnClick="btnSumbit_Click" />
用这个方法比较好,防止多次提交。
--------------------------------------------------------
简单!可行!
这位老兄基本上没有用到asp.net里新增加的特性!
//.net1.1
Button1.Attributes.Add("onclick", "this.disabled=true;" + this.GetPostBackEventReference(this.Button1));
//.net 2.0以上
Button1.Attributes.Add("onclick", "this.disabled=true;" + this.ClientScript.GetPostBackEventReference(Button1, ""));
有这样的事件,可以用来处理。是真实的网页回发,比楼主的5秒要好些吧。
详细可以看我的博客:
http://www.cnblogs.com/chinafine/archive/2008/07/03/1234854.html" target="_new">http://www.cnblogs.com/chinafine/archive/2008/07/03/1234854.html
#9楼 @小龙3
如果刷新又重复提交啦,
#1楼 + #4楼 结合是比较好的方案
我是直接使用JQuery
优点:不用每个按钮增加事件
缺点:不能避免刷新
但是一般为了根本解决重复提交,记录都是有版本号的,每次保存时自增,保存时需验证版本是否一致,也能防止多用户同时提交问题。
每次按钮点击后disable掉
$(document).ready(function(){
$("input").click(function(){
$(this).attr("disabled","disabled");
});
}
<asp:Button ID="btnSumbit" runat="server" UseSubmitBehavior="false" OnClientClick="this.value='Sumbit';this.disabled=true; " Text="Sumbit" OnClick="btnSumbit_Click" />
有验证控件就不行了~
@文炽城
您这样说就不太好了,我感觉只要是自己的心得体会就行了。
我不知道楼主有没有运行自己写的代码,通过清空数据来防止重复提交是行不通的,因为页面刷新是通过“ 简单”重复最新请求来实现的。换句话说,浏览器将缓存已处理的最新请求,并在用户单击页面刷新键时重新发布已处理的请求。
--引用--------------------------------------------------
吴畏: 我不知道楼主有没有运行自己写的代码,通过清空数据来防止重复提交是行不通的,因为页面刷新是通过“ 简单”重复最新请求来实现的。换句话说,浏览器将缓存已处理的最新请求,并在用户单击页面刷新键时重新发布已处理的请求。
--------------------------------------------------------
我也发现大李提供的方法不行,页面已刷新了。
通用的防止F5刷新,重复提交应该在服务器端代码控制!
结合【cookie 时间戳】与【隐藏域 时间戳】对比
我们只要把【cookie 时间戳】每次都刷新
当F5实际浏览器重复提交了上次的 【隐藏域 时间戳】
这种方案适用各种“自己提交给自己Action”的Web: PHP、ASP、JSP

<%
http://www.cnblogs.com/Images/dot.gif" alt="" />@ Page language="c#" AutoEventWireup="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">

<script language="C#" runat="server">
http://www.cnblogs.com/Images/dot.gif" alt="" />
private bool _IsF5RefreshPostBack;
protected void Page_Load(object sender, EventArgs ea)

http://www.cnblogs.com/Images/dot.gif" alt="" />{
if (IsPostBack)

http://www.cnblogs.com/Images/dot.gif" alt="" />{
if (Request.Cookies["cookieTimeStamp"] != null)

http://www.cnblogs.com/Images/dot.gif" alt="" />{
//if (Request.Cookies["cookieTimeStamp"].Value != this.label1.Text)
//不用ViewState 使用 HiddenField 也可
if (Request.Cookies["cookieTimeStamp"].Value != (string) ViewState["vsTimeStamp"])

http://www.cnblogs.com/Images/dot.gif" alt="" />{
_IsF5RefreshPostBack = true;
}
}
}
string timeStamp = DateTime.Now.ToString();
//this.label1.Text = timeStamp;
ViewState["vsTimeStamp"] = timeStamp;
HttpCookie cookie = new HttpCookie("cookieTimeStamp", timeStamp);
Response.Cookies.Add(cookie);
if (_IsF5RefreshPostBack)

http://www.cnblogs.com/Images/dot.gif" alt="" />{
Response.Write("IsRefreshPostBack(F5) in Page Load<br>" );
}

}
void button1_Click (object sender, EventArgs ea)

http://www.cnblogs.com/Images/dot.gif" alt="" />{
if (_IsF5RefreshPostBack)

http://www.cnblogs.com/Images/dot.gif" alt="" />{
Response.Write("IsRefreshPostBack(F5) in Button Click<br>" );
}
}
</script>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:Button ID="button1" Text="button1" onclick="button1_Click" runat="server" />
</form>
</body>
</HTML>
还有一种方案:
就是不要“自己提交给自己”
可以使用@Page 页面指令 SmartNavigation Attribute
呵呵,抛砖引玉。这个功能是大家都要用到的,但是可以看到这么多人有这么多种方法,而且各有优缺点。其他讨论出一个最优的方案来。