asp.net页面防止刷新重新提交的问题

iwalk 2011-03-18 04:02:47
asp.net页面点击提交按钮之后,执行后台数据库操作,然后回到该页面,
此时如果点刷新,就会重新提交,如何防止?

注意:看了一些帖子,解决的办法无非是提交之后重新定位到其他页面,我的要求是必须停留在原来的页面上,因为在提交之后,页面上还有一些后续的按钮操作。
有些帖子说提交后用一个session保存状态,我试了是不行的,刷新的情况下,session里面还是提交之前的值
...全文
1226 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
JL_net 2011-08-14
  • 打赏
  • 举报
回复
提交成功后,再用
Response.Redirect("/aaa.aspx");
重新指向你的本页面aaa.aspx,刷新就不会重新提交了
hch126163 2011-03-18
  • 打赏
  • 举报
回复
1、禁用viewstate!
2、用ajax 提交
3、提交后,禁用按钮
4、添加验证码,提交后清空验证码!提交前判断验证码必填!
itrefer 2011-03-18
  • 打赏
  • 举报
回复
其实使用Ajax提交就没问题了
Cool_xiaocao 2011-03-18
  • 打赏
  • 举报
回复
具个例子吧
先查询数据库某条记录是否已经提交过,没有就执行提交操作,有就返回本页面

protected void Button1_Click(object sender, EventArgs e)
{
string sql = "select id from 表名 where name = XXX";
DataTable dt = DBHelper.GetDataSet(sql);
//已经提交
if (dt != null && dt.Rows.Count > 0)
{
//代码
}
//没有提交
else
{
//相应的后台数据库操作
}
}
钱币老顽童 2011-03-18
  • 打赏
  • 举报
回复
哪有那么麻烦了,直接网上找个ClickOnceButton.dll你的所有问题都解决~\(≧▽≦)/~啦啦啦
风车蚂蚁 2011-03-18
  • 打赏
  • 举报
回复
Response.Redirect(Request.RawUrl.ToString) 跳转到本页面就行
yyz985 2011-03-18
  • 打赏
  • 举报
回复
Response.Redirect(Request.QueryString)
V-Far 2011-03-18
  • 打赏
  • 举报
回复
第一:添加验证码
第二:插入数据库时进行检测
第三:通过检测时间间隔
i592714633 2011-03-18
  • 打赏
  • 举报
回复
有一点我明明白,你提交数据的操作是写在Button的Click事件里的,而刷新页面事件是执行Page_Load事件。那么你刷新页面后,怎么就会执行Click事件里的数据库提交操作了呢???楼主还是把你的代码贴上来看看吧
truecoffeefox 2011-03-18
  • 打赏
  • 举报
回复
以前也有这样的困惑,没找到什么好解决方法,后来提交改为Jquery做ajax,这样就没问题了
baysos 2011-03-18
  • 打赏
  • 举报
回复
几个关键的存储提交数据的input改用html控件。
天下在我心 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 iwalk 的回复:]
asp.net页面点击提交按钮之后,执行后台数据库操作,然后回到该页面,
此时如果点刷新,就会重新提交,如何防止?

注意:看了一些帖子,解决的办法无非是提交之后重新定位到其他页面,我的要求是必须停留在原来的页面上,因为在提交之后,页面上还有一些后续的按钮操作。
有些帖子说提交后用一个session保存状态,我试了是不行的,刷新的情况下,session里面还是提交之前的值
[/Quote]
提交之后,重定向本页面。
  • 打赏
  • 举报
回复
每次提交都要检查Request.Url.Reference.Host(有时会为空),判断是否同域,禁止站外提交

带上验证码,提交成功后,将Session置为另外一种状态Submited,此时如果F5重复提交,判断Session状态不为空则转到一个出错页面(最好是默认主页index.htm什么的)这样即使再点后退也没用了

复杂一点的,你还可以纪录次数和首次提交时间,保存数据之前先判断这个Session状态,检查次数(比如在两分钟内提交五次以上给出警告,并延时Session时间)

不过集成在进程中的Session不稳定,而且太多会吃内存,看需求了,可以几种方法相结合
种草德鲁伊 2011-03-18
  • 打赏
  • 举报
回复
和验证码一样的道理,只不过是不需要填写的(可能是保存在隐藏表单)。
禁用xxxx什么的绝对是不可靠的。
alan_219_2008 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 iwalk 的回复:]

不行的,看来只有禁止刷新了,请问如何禁止刷新呢?不光F5,还有鼠标右键,。。
[/Quote]

鼠标右键禁止 这样不太合理吧?
#23 的方法LZ试了没?
anbam 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mayanly 的回复:]

添加完数据后response.redirect(this.xxx.aspx)
[/Quote]

ok
iwalk 2011-03-18
  • 打赏
  • 举报
回复
不行的,看来只有禁止刷新了,请问如何禁止刷新呢?不光F5,还有鼠标右键,。。
种草德鲁伊 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 rock870210 的回复:]

刚试验了使用ViewState不行。但是可以声明一个全局静态变量
public static string PageRefresh = "";

protected void BtnSubmit_Click(object sender,EventArgs e)
{
if(PageRefresh=="BtnSubmit")
{
Response.Write("这是刷新页面!");
……
[/Quote]

这个web系统只给一个人用的?
Rock870210 2011-03-18
  • 打赏
  • 举报
回复
刚试验了使用ViewState不行。但是可以声明一个全局静态变量
public static string PageRefresh = "";

protected void BtnSubmit_Click(object sender,EventArgs e)
{
if(PageRefresh=="BtnSubmit")
{
Response.Write("这是刷新页面!");
return;
}
else
{
Response.Write("这是第一次提交!");
PageRefresh=BtnSubmit.ID;
}
}
这样是可行的!
alan_219_2008 2011-03-18
  • 打赏
  • 举报
回复
隐藏控件

<input id="hiddenTest" type="hidden" value="<%= GetToken() %>" name="hiddenTestN"/>

cs代码区添加方法:

public string GetToken()
{
if (null != Session["Token"])
{return Session["Token"].ToString(); }
else
{return string.Empty;}}

private void SetToken()
{
Session.Add("Token", FormsAuthentication.HashPasswordForStoringInConfigFile((Session.SessionID + DateTime.Now.Ticks.ToString()),"SHA1"));
}


按钮事件添加判断:

if (!Request.Form.Get("hiddenTestN").Equals(GetToken()))
{return;}
SetToken();



添加一个session,里面的内容使用SHA1加密方式加密
使用之前的名称+时间, 加密后的不可逆,所以不可以再次访问
加载更多回复(22)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧