检测浏览器刷新

5
如何判断用户是否按下F5刷新我的页面(类似于StackOverflow的实现方式。如果您刷新页面,问题计数器将不会增加)。我已经测试了十几个教程中提到的许多代码片段,但都没有正确工作。
更明确地说,假设我有一个空的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
你说“我可以使用会话变量”,那为什么不直接存储最后访问的页面呢? - tomfumb
因为我必须在每个页面中存储它。实际上,使用基础页面可能不是一个坏主意... - Kamyar
2个回答

4
我遇到了这个问题,使用了以下代码。对于我来说它很有效。
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();
    } 
}

1

请问您能解释一下“将重定向到同一页”是什么意思吗? - Kamyar
@kamyar 我使用了CodeProject的代码思路,并加入了一些额外的代码,但它并不总是有效...很复杂。我知道重定向会丢失很多有用的消息数据...我知道... - Aristos
@Kaymyar 在发布之后,一切都正常,你可以使用 Responce.Redirect(Url.RawUrl, true);。 - Aristos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接