我有一个应用程序,我在其中添加一条新记录,如果我按下刷新按钮,记录会被添加两次。
我正在清除缓存,但我遇到了同样的问题。 该怎么办?
答案 0 :(得分:10)
将帖子处理回页面后,最佳做法是重定向,以便您无法使用“刷新”按钮再次发布数据。这对所有Web开发都很常见,而不仅仅是ASP.NET。
答案 1 :(得分:7)
关于ASP联盟的this精彩文章的第4页,我的方法被无耻地窃取了。要检测刷新,可以在ViewState和Session中存储相同的值。如果用户刷新页面,它将使用与您的会话值不匹配的旧ViewState数据进行PostBack。一旦检测到这一点,您就可以使用一个简单的变量创建一个所有其他Pages继承的页面,以测试用户是否刷新了浏览器。此解决方案需要启用ViewState和有效的会话。
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (IsPostBack && ViewState[REFRESH_CHECK_GUID] != Session[REFRESH_CHECK_GUID])
{
IsRefresh = true;
}
Session[REFRESH_CHECK_GUID] = System.Guid.NewGuid().ToString();
ViewState[REFRESH_CHECK_GUID] = Session[REFRESH_CHECK_GUID];
}
/// <summary>
/// True if the last PostBack was caused by a Page refresh.
/// </summary>
public virtual bool IsRefresh
{
get;
private set;
}
答案 2 :(得分:3)
在理想情况下,导致数据库更新的HTTP POST提交会在成功更新到辅助页面后重定向,从而通知用户操作成功。如果用户尝试返回上一页,浏览器将提示用户输入类似于“”的消息。如果不重新发送信息,则无法刷新页面。单击“重试”以重新发送信息,或单击“取消”继续“。这应该足以满足用户提示刷新页面需要重复提交。但是,如果更新失败,则会加载相同的页面并允许用户重试。” / p>
当然,这不是一个严格的规则,实施方式各不相同。我强烈建议将@edg的建议付诸实践 - 在应用插入/更新之前,您的数据库插入代码应始终检查重复。
答案 3 :(得分:2)
如果您没有任何会话(并启用了Cookie),您可以使用:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (IsPostBack && ViewState[REFRESH_CHECK_GUID] != Request.Cookies[REFRESH_CHECK_GUID])
{
IsRefresh = true;
}
String checkGuid=System.Guid.NewGuid().ToString();
Response.Cookies[REFRESH_CHECK_GUID] = checkGuid;
ViewState[REFRESH_CHECK_GUID] = checkGuid;
}
/// <summary>
/// True if the last PostBack was caused by a Page refresh.
/// </summary>
public virtual bool IsRefresh
{
get;
private set;
}
答案 4 :(得分:1)
如果应用程序是您的,则需要添加代码,在尝试将记录保存到数据库之前先检查该记录是否存在。
答案 5 :(得分:0)
问题是由于__EVENTTARGET中隐藏的值无法通过代码设置。
如果您可以使用Ajax添加数据,则可以解决此问题。
答案 6 :(得分:0)
即使我们将Ajax用于整个表单,它也会提供相同的重复插入, 但我们可以尝试清除hiddenfield _EventTaret并更改其他控件的焦点:)
答案 7 :(得分:0)
正如David M上面所说,最好的想法是在帖子之后重定向。另一个服务器往返的影响是非常小的,因为只有http头在重定向中发送。
答案 8 :(得分:0)
如果您需要留在同一页面,我建议您将用户重定向到确认页面,然后您可以询问用户是否要插入其他记录,如果是,那么您将它们重定向回可以插入记录的页面,这有助于防止重复插入。或者,如果他们完成了插入记录,他们就可以进入“主”页面。这是我过去所做的,当我需要用户能够在插入后“停留”在同一页面中时。
答案 9 :(得分:0)
执行插入或更新语句后,您可以使用
将用户重定向到同一页面<强>的Response.Redirect(Request.Url.AbsoluteUri); 强>