原理:1. 在页面第一次加载时,生成一个标志,用session来存储,if (Session["Token"] == null)生成标志。
2. 将session的值赋值给页面的html隐藏控件的value。
3.点击提交时,session的值不为空,也就不会重新生成,用session的值和html隐藏控件的值进行对比,看是否
相等,相等表示提交成功。
4.在提交按钮里面,最后还要把session的值清空,这样当页面再次加载时,session的值不为空,就会重新生成,
这样session的值就会和html隐藏控件不相等,重复提交。
C#代码:
引用命名空间:
using System.Text; //encode
using System.Security.Cryptography;//md5
if (topicbll.TopicAddPoint(TopicId, point, TAddBy, Tclass1, Tclass2, sb.ToString()) > 0)
{
PageAlert("add", "操作成功");
}
else
PageAlert("add", "操作失败");
SetToken();//别忘了最后要更新Session中的标志
}
else
{
PageAlert("dd", "重复提交");
}
}
#region 防刷新提交
//获得当前Session里保存的标志
public string GetToken()
{
if (null != Session["Token"])
{
return Session["Token"].ToString();
}
else
{
return string.Empty;
}
}
//生成标志,并保存到Session
private void SetToken()
{
Session.Add("Token", UserMd5(Session.SessionID + DateTime.Now.Ticks.ToString()));
}
protected string UserMd5(string str1)
{
string cl1 = str1;
string pwd = "";
MD5 md5 = MD5.Create();
// 加密后是一个字节类型的数组
byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(cl1));
// 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
for (int i = 0; i < s.Length; i++)
{
// 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
pwd = pwd + s[i].ToString("X");
}
return pwd;
}
#endregion
html代码:
完成。