刷新页面重复数据库事务?

时间:2012-04-06 12:11:12

标签: c# asp.net page-refresh

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

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

编辑:

以下是其中一个按钮上的代码,它将数据库中的值更改为true或false:

 protected void btn_Publish_Click(object sender, EventArgs e)
{

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

    }

}

执行代码后如果刷新页面执行相同的代码,我注意到,因为在这个方法上有一个断点。

4 个答案:

答案 0 :(得分:2)

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

解决方案是:每次在服务器上执行侵入式处理(插入/更新/删除)时,您不只是渲染页面而是将响应重定向到302 < fresh 页面上显示“您的交易成功”消息。

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

取决于您是否直接适用于您的方案。

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

答案 1 :(得分: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);
    }

答案 2 :(得分:1)

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

  
      
  1. 必要时禁用提交按钮
  2.   
  3. 为您的代码添加一些验证并检查双重条目
  4.   
  5. 提交后将用户重定向到另一个页面
  6.   

答案 3 :(得分:0)

除非付款等真实的“交易”(其他人已经解释过,请重定向等), 您还可以尝试在与您的应用相关的网页上定义与Db交互或存在瓶颈的缓存
如果你想拥有永远的实时信息(这就是那种“活着”的应用程序类型)那么这个解决方案没有运气(但即便如此),但通常情况下,你可以将一些合理的时间到期,以确定你希望数据的“新鲜”程度如何是。
Caching ASP.NET Pages