我有超过30个aspx页面,我最近发现了一个问题,如果我做任何类型的数据库事务,如插入,更新,删除,然后在事务完成后我按F5或刷新页面,无论如何同样是交易发生。
我搜索了一个解决方案,但我能找到的是我必须检查每个按钮上的viewstate是不可能的,因为这意味着会有很多工作。必须有通用解决方案,请帮助我解决这个问题。
编辑:
以下是其中一个按钮上的代码,它将数据库中的值更改为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);
}
}
执行代码后如果刷新页面执行相同的代码,我注意到,因为在这个方法上有一个断点。
答案 0 :(得分:2)
有一个通用的解决方案,成千上万的开发人员使用了多年。
解决方案是:每次在服务器上执行侵入式处理(插入/更新/删除)时,您不只是渲染页面而是将响应重定向到302 < fresh 页面上显示“您的交易成功”消息。
这样,按F5将只刷新此消息页面,而不是触发事务的原始页面。
取决于您是否直接适用于您的方案。
答案 1 :(得分:2)
你可以试试这个。我在几个项目中使用了这个并且成功地工作了。
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);
}
答案 2 :(得分:1)
要解决此问题,您可以查看以下内容:
- 必要时禁用提交按钮
- 为您的代码添加一些验证并检查双重条目
- 提交后将用户重定向到另一个页面
醇>
答案 3 :(得分:0)
除非付款等真实的“交易”(其他人已经解释过,请重定向等),
您还可以尝试在与您的应用相关的网页上定义与Db交互或存在瓶颈的缓存 。
如果你想拥有永远的实时信息(这就是那种“活着”的应用程序类型)那么这个解决方案没有运气(但即便如此),但通常情况下,你可以将一些合理的时间到期,以确定你希望数据的“新鲜”程度如何是。
Caching ASP.NET Pages