【问题标题】:Refresh page repeat database transaction?刷新页面重复数据库事务?
【发布时间】:2012-04-06 12:11:12
【问题描述】:

我有超过 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);

    }

}

在执行代码后,如果刷新页面,同样的代码会被执行,我注意到因为在这个方法上放置了一个断点。

【问题讨论】:

  • 如果您发布了代码,也许有人可以帮助您。这种方式我们只能假设。
  • 您是否尝试过 Post-Redirect-Get 模式?多解释或提供代码
  • 我同意@Bojan。这太模糊了,答案必须做出太多假设。

标签: c# asp.net page-refresh


【解决方案1】:

你可以试试这个。我在几个项目中使用它并成功地工作。

 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);
    }

【讨论】:

  • 在appcode中添加一个cs文件,并把这个方法放进去。之后在您的网页中继承此内容。
  • 所以我所要做的就是在我的页面中继承这个类,我不需要对每个按钮事件进行任何检查吗?
  • 我能够运行代码并且它运行良好,只有一个小问题,当页面刷新时,页面的旧内容被重新加载,无论如何都要使视图状态为是不是把旧的放回去了。
  • 请检查您的 onload 事件。我认为你错过了什么
【解决方案2】:

有一种通用解决方案,已被数千名开发人员使用多年。

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-09
        • 1970-01-01
        • 2012-05-23
        • 2011-07-05
        • 2017-08-06
        • 2016-03-03
        • 2011-06-05
        • 2019-10-14
        相关资源
        最近更新 更多