Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 刷新页面重复数据库事务?_C#_Asp.net_Page Refresh - Fatal编程技术网

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

C# 刷新页面重复数据库事务?,c#,asp.net,page-refresh,C#,Asp.net,Page Refresh,我有30多个aspx页面,我最近发现了一个问题,如果我做了任何类型的数据库事务,如插入、更新、删除,然后在事务完成后,我按F5键或刷新页面,不管怎样,都会发生相同的事务 我寻找了一个解决方案,但我所能找到的是,我必须检查每个按钮上的viewstate,这是不可能的,因为这意味着将有大量的工作。必须有通用的解决方案,请帮我解决这个问题 编辑: 以下是将数据库中的值更改为true或false的其中一个按钮上的代码: protected void btn_Publish_Click(object s

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

    }

}

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

有一个通用解决方案,数千名开发人员使用了多年

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

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

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


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

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

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

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


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

  • 必要时禁用“提交”按钮
  • 在代码中添加一些验证,并检查是否有双重条目
  • 提交后将用户重定向到另一页

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

  • 必要时禁用“提交”按钮
  • 在代码中添加一些验证,并检查是否有双重条目
  • 提交后将用户重定向到另一页

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

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

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

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

    除非它是一个真正的“交易”,如支付等(其他人已经解释过了,请重新定向等),
    您也可以尝试在与Db交互的页面上定义缓存,或者在应用程序中定义瓶颈。
    如果你想一直保持实时信息(而且是那种“实时”类型的应用程序),那么解决方案就不太可能成功(但即便如此),但通常情况下,你可以对你想要的数据“新鲜”程度设定合理的期限。

    除非它是一个真正的“交易”,如支付等(其他人已经解释过了,确实是重定向等),
    您也可以尝试在与Db交互的页面上定义缓存,或者在应用程序中定义瓶颈。
    如果你想一直保持实时信息(而且是那种“实时”类型的应用程序),那么解决方案就不太可能成功(但即便如此),但通常情况下,你可以对你想要的数据“新鲜”程度设定合理的期限。

    如果您发布代码,可能会有人帮您。这样我们只能假设。您尝试过后重定向获取模式吗?解释更多或提供代码我同意@Bojan。这太模糊了,答案会有太多的假设。也许如果你发布了你的代码,有人可以帮你。这样我们只能假设。您尝试过后重定向获取模式吗?解释更多或提供代码我同意@Bojan。这太模糊了,答案将不得不做出太多的假设。在appcode中添加一个cs文件,并将此方法放入其中。然后在你的网页中继承这个。所以我所要做的就是在我的网页中继承这个类,我不需要对每个按钮事件进行任何检查吗?我能够运行代码,它工作得很好,只有一个小问题,当页面刷新时,页面的旧内容会重新加载,是否仍然可以使视图状态保持原样,而不是将旧视图放回原样。请检查您的onload事件。我认为您缺少一些东西在appcode中添加一个cs文件并将此方法放在其中。然后在你的网页中继承这个。所以我所要做的就是在我的网页中继承这个类,我不需要对每个按钮事件进行任何检查吗?我能够运行代码,它工作得很好,只有一个小问题,当页面刷新时,页面的旧内容会重新加载,是否仍然可以使视图状态保持原样,而不是将旧视图放回原样。请检查您的onload事件。我想你错过了什么