【问题标题】:How to avoid the button events on Refresh of page如何避免页面刷新按钮事件
【发布时间】:2011-01-11 04:03:27
【问题描述】:

我有 .aspx 页面,该页面通过单击按钮将数据插入数据库。但是当我按下按钮时,它是正确的。我收到“成功插入数据”的成功消息。在这种情况下,如果我按“F5”或刷新页面,它会触发按钮单击事件。为什么应该这样?如何避免这种情况?

【问题讨论】:

  • 你能添加一些你的代码吗??

标签: asp.net events refresh


【解决方案1】:

添加更新面板并将更新面板的更新模式设置为条件。 这对我有用!

【讨论】:

    【解决方案2】:

    在你的课堂上添加这个:

    #region Browser Refresh
    private bool refreshState;
    private bool isRefresh;
    
    protected override void LoadViewState(object savedState)
    {
        object[] AllStates = (object[])savedState;
        base.LoadViewState(AllStates[0]);
        refreshState = bool.Parse(AllStates[1].ToString());
        if (Session["ISREFRESH"] != null && Session["ISREFRESH"] != "")
            isRefresh = (refreshState == (bool)Session["ISREFRESH"]);
    }
    
    protected override object SaveViewState()
    {
        Session["ISREFRESH"] = refreshState;
        object[] AllStates = new object[3];
        AllStates[0] = base.SaveViewState();
        AllStates[1] = !(refreshState);
        return AllStates;
    }
    
    #endregion 
    

    然后在您的按钮中单击执行以下操作:

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (isRefresh == false)
        {
            Insert Code here
    

    【讨论】:

    • 好答案。你介意在这里解释你的代码吗?谢谢
    • 我假设LoadViewStateSaveViewState 需要连接到某些事件?哪些和/或你是如何做到的?
    • 不错!我将代码放在我的基本页面中,并在存在按钮单击事件的页面中使用了 if 条件。效果很好!干得好 +1 为你
    • 我使用了你的代码,我遇到了一个问题,如果我的按钮点击事件不是 Ajax,那么在第一次点击按钮时 isrefresh 为 true,所以如果我第二次点击按钮 Isrefresh 为 false 并且数据为提交给数据库。
    【解决方案3】:

    当用户点击 F5(或使用工具栏按钮刷新页面)时,导致一个与前一个相同的新请求被发送到服务器。 Button.Click 事件再次引发,但您有一些方法可以保护自己免受两次插入数据的影响。

    恕我直言,最好的方法是使用Post/Redirect/Get pattern。在您的代码中,在数据保存点之后,执行 302 重定向到确认页面:

    protected void btnSaveStuff_Click(object sender, EventArgs e)
    {
        SaveStuffToDatabase();
        Response.Redirect("confirmation.aspx");
    }
    

    使用该模式时,原页面的POST不会出现在浏览器历史记录中,刷新结果页面会导致最终的GET重复,应该是安全的。

    【讨论】:

    • 我读过这篇文章。但是如何在主细节场景中使用 GET/POST 呢?
    • 我不确定您所说的“主细节场景”是什么意思。如我的代码示例所示,您只需执行Response.Redirect,它将“取消”然后POST 并使浏览器变为新的GET
    • 如果在保存数据结束时需要在这种情况下显示一些显示消息,@Love-40 的答案是正确的
    • @xyz 我仍然希望通过重定向来“破坏” POST。如果要显示确认屏幕,请在单独的 URL 上创建它并从 POST 重定向到此处。
    【解决方案4】:

    刷新将重新提交您上次单击按钮时发布的表单。

    通常,当您刷新页面时,您会考虑再次获取该页面,或者执行 HTTP GET,但由于您所做的最后一件事是 POST(当您单击提交按钮时),浏览器将再次执行发布以尝试调用相同的响应。

    我建议使用 Jorn Schou-Rode 建议的 Post/Redirect/Get 模式。

    这篇文章似乎也很相关。 http://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh

    【讨论】:

    • 我不认为 TJB 您提供的第二个链接是使用完整的。我需要太多的执行,对吗?真正的代码是好的但不是正确的方法。请参阅如果我有 100 页,因此根据本文,我需要在每个页面上使用相应的字段进行编码。这是错误的。还有其他方法吗?请
    猜你喜欢
    • 1970-01-01
    • 2014-02-15
    • 2021-09-12
    • 2017-05-17
    • 1970-01-01
    • 2013-10-07
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多