检测浏览器刷新

Posted

技术标签:

【中文标题】检测浏览器刷新【英文标题】:Detect browser refresh 【发布时间】:2011-09-30 17:16:03 【问题描述】:

如何确定用户是否按 F5 刷新我的页面(类似于 SO 的实现方式。如果刷新页面,问题计数器不会增加)。我测试了许多教程中提到的许多代码 sn-ps,但没有一个能正常工作。

为了更清楚,假设我有一个空的 Web 表单,并且想检测用户是否在客户端按下了 F5(导致刷新未提交)。

我可以使用会话变量,但如果用户导航到我网站的另一个页面,然后返回,我想将其视为新访问,而不是刷新。所以这不是会话范围的变量。

谢谢。

更新:我能找到的唯一解决方法是从基本页面继承我的页面,覆盖如下加载方法:

    public class PageBase : System.Web.UI.Page

    protected override void OnLoad(EventArgs e)
    
        base.OnLoad(e);
        this.Session["LastViewedPage"] = Request.RawUrl;
    
  

如果我想知道这是否是一次刷新,请在每个页面中:

if (this.Session["LastViewedPage"].ToString() == Request.RawUrl)

    // This is a refresh!

【问题讨论】:

你说'我可以使用会话变量'那为什么不只存储上次访问的页面呢? 因为我必须将它存储在每个页面中。实际上,使用基本页面可能不是一个坏主意... 【参考方案1】:

我遇到了这个问题并使用以下代码。对我来说效果很好。

bool isPageRefreshed = false;

protected void Page_Load(object sender, EventArgs args)

    if (!IsPostBack)
    
        ViewState["ViewStateId"] = System.Guid.NewGuid().ToString();
        Session["SessionId"] = ViewState["ViewStateId"].ToString();
    
    else
    
        if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString())
        
            isPageRefreshed = true;
        

        Session["SessionId"] = System.Guid.NewGuid().ToString();
        ViewState["ViewStateId"] = Session["SessionId"].ToString();
     

【讨论】:

【参考方案2】:

唯一确定的解决方案是a redirect to the same page,这里有一个类似的问题:Post-Redirect-Get with ASP.NET

但也有一些其他的技巧,通过在页面上添加一些票,看看这是否相同或有变化,请参阅完整的示例和代码:

http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET

还有一个:

http://dotnetslackers.com/community/blogs/simoneb/archive/2007/01/06/Using-an-HttpModule-to-detect-page-refresh.aspx

【讨论】:

您能解释一下“重定向到同一页面”吗? @kamyar 我已经将代码项目的想法与一些额外的代码一起使用,但并不总是有效......很复杂。我知道重定向会丢失很多有用的消息数据...我知道... @Kaymyar 发布后,一切正常,您进行 Responce.Redirect(Url.RawUrl, true);

以上是关于检测浏览器刷新的主要内容,如果未能解决你的问题,请参考以下文章

使用onbeforeunload事件检测窗口是否刷新或关闭 .

javascript检测浏览器窗口大小变化事件

检测刷新和重新加载之间的区别

使用一个HttpModule拦截Http请求,来检测页面刷新(F5或正常的请求)

在 PHP 中检测浏览器退出

如何检测浏览器窗口/选项卡关闭事件?