c#(asp.net)防止刷新重复提交数据的解决方法
本文导语: 到于这个问题的解决方法,先给出一个MSDN上的: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/BedrockASPNET.asp 通过重新定义 System.Web.UI.Page 类来实现加载页面时,是“刷新”、“后退”请求,还是正常请求,...
到于这个问题的解决方法,先给出一个MSDN上的: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/BedrockASPNET.asp
通过重新定义 System.Web.UI.Page 类来实现加载页面时,是“刷新”、“后退”请求,还是正常请求,其他页面则继承了自定义的Page类。
方法很独特,有兴趣的朋友,可以参考下。
其它解决此类问题的方法,是不保存缓存,即提交后表单上的数据不会被浏览器的缓存保存,如果此时再遇到刷新或者后退请求时,就会显示“网页已过期”,数据也就不会重复提交了,这样就起到了阻止刷新重复提交的效果。
下面我们以提交一篇帖子为例,介绍禁用缓存防止刷新重复提交的方法,表单数据包括“标题”和“正文”两个部分。
1、代码(post.aspx):
//页面加载
protected void Page_Load(object sender, EventArgs e)
{
//可以在页面加载时设置页面的缓存为“SetNoStore()”,即无缓存
Response.Cache.SetNoStore();
//Session中存储的变量“IsSubmit”是标记是否提交成功的
if ((bool)Session["IsSubmit"])
{
//如果表单数据提交成功,就设“Session["IsSubmit"]”为false
Session["IsSubmit"] = false;
//显示提交成功信息
ShowMsg.Text = " * 提交成功!";
}
else
//否则的话(没有提交,或者是页面刷新),不显示任何信息
ShowMsg.Text = "";
}
//提交按钮(btnOK)单击事件
protected void btnOK_Click(object sender, EventArgs e)
{
if (txtTitle.Text.ToString().Trim() == "")
//ShowMsg是用来显示提示信息的
ShowMsg.Text = " * 标题不能为空!";
else if (txtText.Text.ToString().Trim() == "")
ShowMsg.Text = " * 内容不能为空!";
else
{
//这里是将数据提交到数据库中,省略
/*
string sql = "insert into tab...values(...)";
MyConn.ExecQuery(sql);
*/
//提交成功后,设“Session["IsSubmit"]”为true
Session["IsSubmit"] = true;
//强制转换页面(不可少,否则刷新仍会重复提交,仍转到本页),
通过页面的转换将缓存中的提交的数据都释放了,即提交的标单数据不会被保存到缓存里,
如果后退的话,将会出现该页无法显示
Response.Redirect("post.aspx");
}
}
以上方法简单实用,推荐使用。
下面提供一个我自己研究的,该方法不同于“不保存缓存的方法”,它是让浏览器保存所有页面缓存的。
该方法通过随机码的方式 来判断是正常提交还是“刷新”或“后退”的。
首先(提交页面是post.aspx)在Session中增加变量Rnd用来存放随机码,同时在提交表单数据时不做处理,而是让页面转到 post.aspx?r=x,这里“x”等于Session["Rnd"],这个时候在页面加载时,通过判断r的值和Session["Rnd"]的值是否相同,如果相同就处理提 交的数据,否则即可认为是“刷新”或者是“后退”操作了,最后再次赋给Session["Rnd"]一个随机码。
2、代码(post.aspx):
//获取随机码
public class MyRnd
{
public static string Rnd()
{
//随机码是由 0-9 a-z A-Z 之间的数字或字母组成的
//下面是生成的20位随机码
//0..9 A..Z a..z
//48-57 65-90 97-122
string rst = "";
Random rr = new Random();
for (int i = 0; i < 20; i++)
{
int ir = 0;
do
{
ir = rr.Next(123);
if((ir >= 48) && (ir = 65) && (ir = 97) && (ir