刷新页面重复数据库事务
本文关键字:数据库 事务 刷新 | 更新日期: 2023-09-27 18:30:27
我有超过 30 个 aspx 页面,我最近发现了一个问题,如果我执行任何类型的数据库事务,如插入、更新、删除,然后在事务完成后我按 F5 或刷新页面,无论如何都会发生相同的事务。
我寻找了一个解决方案,但我能找到的只是我必须检查每个按钮上的视图状态,这是不可能的,因为这意味着会有很多工作。必须有通用的解决方案,请帮助我解决这个问题。
编辑:
以下是其中一个按钮上的代码,该按钮将数据库中的值更改为 true 或 false:
protected void btn_Publish_Click(object sender, EventArgs e)
{
if (Convert.ToBoolean(int.Parse(hf_Published.Value.ToString())))
{
publish(false);
}
else
{
publish(true);
}
}
执行代码后,如果刷新页面,则执行相同的代码,我注意到由于在此方法上放置了一个断点。
你可以
试试这个。我在几个项目中使用了它并成功工作。
public bool IsRefreshed
{
get
{
if (Convert.ToString(Session["RefreshTimeStamp"]) == Convert.ToString(ViewState["RefreshTimeStamp"]))
{
Session["RefreshTimeStamp"] = HttpContext.Current.Server.UrlDecode(System.DateTime.Now.ToString());
return false;
}
else
{
return true;
}
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ViewState["RefreshTimeStamp"] = Session["RefreshTimeStamp"];
}
protected override void OnLoad(EventArgs e)
{
if (!Page.IsPostBack)
{
Session["RefreshTimeStamp"] = HttpContext.Current.Server.UrlDecode(System.DateTime.Now.ToString());
}
base.OnLoad(e);
}
有一个通用的解决方案,被成千上万的开发人员使用多年。
解决方案是:每次在服务器上执行侵入性进程(插入/更新/删除)时,您不仅要渲染页面,还要将带有 302 的响应重定向到带有"您的事务成功"消息的新页面。
这样,按 F5 将只刷新此消息页面,而不是触发事务的原始页面。
这是否直接适用于你的方案取决于您。
http://en.wikipedia.org/wiki/Post/Redirect/Get
要解决此问题,您可以检查以下内容:
- 必要时禁用提交按钮
- 向代码添加一些验证并检查重复条目
- 提交后将用户重定向到另一个页面
除非是真正的"交易",如付款等(其他人已经解释过,重定向等),
您还可以尝试在与 Db 交互或作为应用瓶颈的页面上定义缓存。
如果你想一直拥有实时信息(它是那种"活着"类型的应用程序),那么这个解决方案就没有运气了(但即便如此),但通常,你可以把一些合理的时间到期时间放在你希望你的数据的"新鲜"程度上。
缓存 ASP.NET 页面