0

我有超过 30 个 aspx 页面,我最近发现了一个问题,如果我执行任何类型的数据库事务,如插入、更新、删除,然后在事务完成后按 F5 或刷新页面,无论如何都会发生事务。

我搜索了一个解决方案,但我发现我必须检查每个按钮上的视图状态,这是不可能的,因为这意味着会有很多工作。必须有通用的解决方案,请帮助我解决这个问题。

编辑:

以下是将数据库中的值更改为真或假的按钮之一上的代码:

 protected void btn_Publish_Click(object sender, EventArgs e)
{

    if (Convert.ToBoolean(int.Parse(hf_Published.Value.ToString())))
    {
        publish(false);
    }
    else
    {
        publish(true);

    }

}

执行代码后,如果刷新页面,则执行相同的代码,我注意到由于在此方法上放置了一个断点。

4

4 回答 4

2

有一个通用的解决方案,被成千上万的开发人员使用了多年。

解决方案是:每次您在服务器上执行侵入式过程(插入/更新/删除)时,您不仅会呈现页面,而且会将带有 302 的响应重定向到带有“您的事务成功”消息的新页面。

这样,按 F5 只会刷新这个消息页面,而不是触发事务的原始页面。

这是否直接适用于您的场景取决于您。

http://en.wikipedia.org/wiki/Post/Redirect/Get

于 2012-04-06T12:15:38.843 回答
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);
    }
于 2012-04-06T12:19:42.173 回答
1

要解决此问题,您可以检查以下内容:

  1. 必要时禁用提交按钮
  2. 为您的代码添加一些验证并检查是否重复输入
  3. 提交后将用户重定向到另一个页面
于 2012-04-06T12:16:57.623 回答
0

除非它是真正的“交易”,例如支付等(其他人已经解释过,做重定向等),
否则您还可以尝试在与 Db 交互的页面上定义缓存,或者是您的应用程序的瓶颈。
如果您想始终拥有实时信息(并且是那种“实时”类型的应用程序),那么该解决方案也没有运气(但即便如此),但通常情况下,您可以对您希望数据的“新鲜程度”设置一些合理的时间期限是。
缓存 ASP.NET 页面

于 2012-04-06T12:25:28.400 回答