如何在.net中检测页面刷新

我有一个Button_click事件。 在刷新页面时,先前的Postback事件再次触发。 如何识别页面刷新事件以防止Postback操作?

我尝试了下面的代码来解决它。 实际上,我在SharePoint页面中添加了一个可视webpart。 添加webpart是一个post back事件所以!每次我将webpart添加到页面时,postback总是为false,并且我在else循环中收到错误,因为对象引用为null

 if (!IsPostBack){ ViewState["postids"] = System.Guid.NewGuid().ToString(); Cache["postid"] = ViewState["postids"].ToString(); } else{ if (ViewState["postids"].ToString() != Cache["postid"].ToString()){ IsPageRefresh = true; } Cache["postid"] = System.Guid.NewGuid().ToString(); ViewState["postids"] = Cache["postid"].ToString(); } 

我该如何解决这个问题?

使用viewstate对我来说效果更好,详见此处 。 基本上:

 bool IsPageRefresh = false; //this section of code checks if the page postback is due to genuine submit by user or by pressing "refresh" if (!IsPostBack) { ViewState["ViewStateId"] = System.Guid.NewGuid().ToString(); Session["SessionId"] = ViewState["ViewStateId"].ToString(); } else { if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString()) { IsPageRefresh = true; } Session["SessionId"] = System.Guid.NewGuid().ToString(); ViewState["ViewStateId"] = Session["SessionId"].ToString(); } 

这篇文章对您有所帮助http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET

您正在向视图状态添加Guid以唯一标识每个页面。 当您在Page类本身时,此机制可以正常工作。 如果需要在到达页面处理程序之前识别请求,则需要使用其他机制(因为视图状态尚未恢复)。

Page.LoadComplete事件是检查Guid是否与页面关联的合理位置,如果不是,则创建一个。

检查这个http://shawpnendu.blogspot.in/2009/12/how-to-detect-page-refresh-using-aspnet.html

如果你想在HTTP GET上检测刷新而不是仅检测POST,那么在现代浏览器中,这是一个非常糟糕的解决方案,主要是有效的。

使用Javascript:

 window.onload = function () { // regex for finding "loaded" query string parameter var qsRegex = /^(\?|.+&)loaded=\d/ig; if (!qsRegex.test(location.search)) { var loc = window.location.href + (window.location.search.length ? '&' : '?') + 'loaded=1'; window.history.replaceState(null, document.title, loc); } }; 

C#:

 public bool IsPageRefresh { get { return !string.IsNullOrEmpty(Request.QueryString["loaded"]); } } 

当页面加载时,它将改变添加一个Query loaded=1的QueryString参数而不重新加载页面(同样,这个 – window.history.replaceState – 只能在后期浏览器中工作 )。 然后,当用户刷新页面时,服务器可以检查是否存在查询字符串的loaded参数。

警告: 大多数都有效

这不起作用的情况是用户单击地址栏并按Enter键 。 也就是说,服务器将产生误报,检测到刷新,当赔率为时,用户实际上意味着重新加载页面。

根据你的目的,也许这是可取的,但作为一个用户,如果我希望它重置页面,它会让我发疯。

我没有过多考虑,但是为了通过地址栏使用any / all:区分刷新和重置, 可能会写一些魔法:

  • SessionState (假设启用了SessionState )和loaded QueryString参数的值
  • window.onbeforeunload事件监听器
  • 键盘事件(检测F5Ctrl + R以快速更改URL以删除loaded QueryString参数 – 尽管这会因为单击浏览器的刷新按钮而产生假阴性)
  • cookies

如果有人提出解决方案,我很乐意听到。

另一种检查页面刷新的方法。 我编写了没有java脚本或任何客户端的自定义代码。

不确定,这是最好的方式,但我感觉很好。

 protected void Page_Load(object sender, EventArgs e) { if ((Boolean)Session["CheckRefresh"] is true) { Session["CheckRefresh"] = null; Response.Write("Page was refreshed"); } else { } } protected void Page_PreInit(object sender, EventArgs e) { Session["CheckRefresh"] = Session["CheckRefresh"] is null ? false : true; }