C# 刷新页面重复数据库事务?
我有30多个aspx页面,我最近发现了一个问题,如果我做了任何类型的数据库事务,如插入、更新、删除,然后在事务完成后,我按F5键或刷新页面,不管怎样,都会发生相同的事务 我寻找了一个解决方案,但我所能找到的是,我必须检查每个按钮上的viewstate,这是不可能的,因为这意味着将有大量的工作。必须有通用的解决方案,请帮我解决这个问题 编辑: 以下是将数据库中的值更改为true或false的其中一个按钮上的代码:C# 刷新页面重复数据库事务?,c#,asp.net,page-refresh,C#,Asp.net,Page Refresh,我有30多个aspx页面,我最近发现了一个问题,如果我做了任何类型的数据库事务,如插入、更新、删除,然后在事务完成后,我按F5键或刷新页面,不管怎样,都会发生相同的事务 我寻找了一个解决方案,但我所能找到的是,我必须检查每个按钮上的viewstate,这是不可能的,因为这意味着将有大量的工作。必须有通用的解决方案,请帮我解决这个问题 编辑: 以下是将数据库中的值更改为true或false的其中一个按钮上的代码: protected void btn_Publish_Click(object s
protected void btn_Publish_Click(object sender, EventArgs e)
{
if (Convert.ToBoolean(int.Parse(hf_Published.Value.ToString())))
{
publish(false);
}
else
{
publish(true);
}
}
在执行代码后,如果刷新页面,则执行相同的代码,我注意到,由于在该方法上放置了一个断点。有一个通用解决方案,数千名开发人员使用了多年 解决方案是:每次在服务器上执行侵入性过程(插入/更新/删除)时,您不仅要呈现页面,而且要使用302将响应重定向到一个带有“您的事务成功”消息的新鲜页面 这样,按F5只会刷新此消息页面,而不是触发事务的原始页面 这取决于您是否直接适用于您的场景
有一种通用的解决方案,数千名开发人员使用了多年 解决方案是:每次在服务器上执行侵入性过程(插入/更新/删除)时,您不仅要呈现页面,而且要使用302将响应重定向到一个带有“您的事务成功”消息的新鲜页面 这样,按F5只会刷新此消息页面,而不是触发事务的原始页面 这取决于您是否直接适用于您的场景
要解决此问题,您可以检查以下内容:
要解决此问题,您可以检查以下内容:
你可以试试这个。我在几个项目中使用了它,并成功地完成了工作
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);
}
你可以试试这个。我在几个项目中使用了它,并成功地完成了工作
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);
}
除非它是一个真正的“交易”,如支付等(其他人已经解释过了,请重新定向等),
您也可以尝试在与Db交互的页面上定义缓存,或者在应用程序中定义瓶颈。
如果你想一直保持实时信息(而且是那种“实时”类型的应用程序),那么解决方案就不太可能成功(但即便如此),但通常情况下,你可以对你想要的数据“新鲜”程度设定合理的期限。
除非它是一个真正的“交易”,如支付等(其他人已经解释过了,确实是重定向等),
您也可以尝试在与Db交互的页面上定义缓存,或者在应用程序中定义瓶颈。
如果你想一直保持实时信息(而且是那种“实时”类型的应用程序),那么解决方案就不太可能成功(但即便如此),但通常情况下,你可以对你想要的数据“新鲜”程度设定合理的期限。
如果您发布代码,可能会有人帮您。这样我们只能假设。您尝试过后重定向获取模式吗?解释更多或提供代码我同意@Bojan。这太模糊了,答案会有太多的假设。也许如果你发布了你的代码,有人可以帮你。这样我们只能假设。您尝试过后重定向获取模式吗?解释更多或提供代码我同意@Bojan。这太模糊了,答案将不得不做出太多的假设。在appcode中添加一个cs文件,并将此方法放入其中。然后在你的网页中继承这个。所以我所要做的就是在我的网页中继承这个类,我不需要对每个按钮事件进行任何检查吗?我能够运行代码,它工作得很好,只有一个小问题,当页面刷新时,页面的旧内容会重新加载,是否仍然可以使视图状态保持原样,而不是将旧视图放回原样。请检查您的onload事件。我认为您缺少一些东西在appcode中添加一个cs文件并将此方法放在其中。然后在你的网页中继承这个。所以我所要做的就是在我的网页中继承这个类,我不需要对每个按钮事件进行任何检查吗?我能够运行代码,它工作得很好,只有一个小问题,当页面刷新时,页面的旧内容会重新加载,是否仍然可以使视图状态保持原样,而不是将旧视图放回原样。请检查您的onload事件。我想你错过了什么