当我按F5时btnAdd_Click触发

时间:2009-07-16 04:38:28

标签: c# asp.net

您好我有一个简单的代码,可以在按钮点击事件中将数据插入到数据库中。它正在执行正常并将数据插入db。插入数据后,如果我按f5按钮,它将再次向db中插入一个具有相同值的新行。

按钮点击事件在每个f5按钮上触发(刷新)

Wat是问题?

谢谢你, 纳古

2 个答案:

答案 0 :(得分:2)

这是按照设计的。当你按F5键时,你正在重做刚才做的回发。为了防止这种情况,您可以获得无穷无尽的解决方案,例如:

在初始加载时使用会话变量,并在第一次(保存)发布后清除该值。确保检查是否存在此值。

// On inital page load for data entry store a key.
// This is a basic example, you should have a session wrapper
Session["Unsaved"] = 1;

// When you do the save logic make sure you check this session variable and save if
// it still exists.
if (Session["Unsaved"] != null)
{
  // Save data here
  Session.Remove("Unsaved");
}
else
{
  // Show message that save has already completed or session has expired.
}

您也可以执行检查数据库端并验证您没有插入相同的数据(这可能无法正常工作)

在过去,我通过编辑来阻止这种情况,例如存储修订号并让它提交带有发布数据的修订号。保存时,如果修订号不匹配(因为每次更新都更改了,并且检查完成了DB侧),则更新失败,我会显示一条消息。

对于新数据,您还可以执行Response.Redirect到“完整”页面,该页面为他们提供成功/失败的最新信息。如果他们点击刷新,他们只会重新加载已完成的页面,而不是正在进行插入/更新的页面。

同样有很多不同的解决方案。对于每种情况都没有什么是完美的,所以你需要找出哪种方法最适合你。

答案 1 :(得分:1)

您可以采取的一种方法是在回发后重定向Web浏览器。这将使得按下刷新按钮或F5将导致加载新页面。

示例:

protected void button_Click(object sender, EventArgs args)
{
    // Insert data, etc.

    Response.AddHeader("Location", "DifferentPage.aspx");
}