检测浏览器刷新
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事件检测窗口是否刷新或关闭 .