检测页面刷新 jQuery 或 C# ASP.Net

Posted

技术标签:

【中文标题】检测页面刷新 jQuery 或 C# ASP.Net【英文标题】:detect page refresh jQuery or C# ASP.Net 【发布时间】:2011-01-27 12:51:24 【问题描述】:

我正在寻找一种在我的 C# 代码中检测页面是否已刷新 (f5) 的方法。

首先我不知道 jQuery/javascript 解决方案是否会比完全 C# ASP.Net 更好。所以...第一个问题是:是什么让你选择一个而不是另一个?

第三个也是最重要的部分是,如果有人愿意帮助我解决这个问题。一些好的教程,或文章......任何东西。我尝试了一些解决方案……但也许因为我缺乏知识,它们没有奏效。

提前致谢。


更新 1

我尝试做 Hightechrider 解决方案,因为它看起来很容易实现。所以我输入了这段代码:

public bool IsRefresh  get; set; 

protected override void OnPreInit(EventArgs e)

    base.OnPreInit(e);

    IsRefresh = false;
    if (Page.Request.AppRelativeCurrentExecutionFilePath == Profiles.User.LastPageUrl &&
        !Page.IsPostBack)
        IsRefresh = true;

PS:Profiles.User.LastPageUrl 是我为其他目的而创建的会话变量,但它满足了这一需求。所以这不是一些内置属性。

但是,经过几次测试后,我得出的结论是,一个页面可以同时是 PostBack 和 Refresh。因为用户可以按下一个按钮,然后点击刷新。因此,由于!Page.IsPostBack,这种情况使我以前的代码无效。 我仍在寻找一个简单直接的解决方案。

【问题讨论】:

【参考方案1】:

据我所知,大多数浏览器的浏览器刷新不会发送任何特殊信息来指示刷新按钮被按下。但是,有一些选项,具体取决于您要完成的工作。

我建议阅读以下内容,看看它们是否能帮助您到达需要的地方:

Page.isPostback property Post-Redirect-Get Pattern

只是一种直觉,但上面的第二项可能是您需要的路径。有时,解决问题的最佳方法是消除问题。也就是说,构建解决方案以使推送刷新一开始就不需要特殊处理。

至于 Javascript(客户端)与 ASP.NET(服务器端),我认为您最终可能会选择两者的某种组合,而不是非此即彼。

【讨论】:

【参考方案2】:

把这个放到一个继承Page的基类中,这个在VB.Net中,转换成C#不会太难

    Private mRefreshState As Boolean
    Private mIsRefresh As Boolean

    Public ReadOnly Property IsRefreshFromPostBack() As Boolean
        Get
            Return mIsRefresh
        End Get
    End Property

    Protected Overrides Sub LoadViewState(ByVal savedState As Object)
        Dim allStates As Object() = DirectCast(savedState, Object())
        MyBase.LoadViewState(allStates(0))
        mRefreshState = Convert.ToBoolean(allStates(1))
        mIsRefresh = mRefreshState = Convert.ToBoolean(Session("__ISREFRESH"))
    End Sub

    Protected Overrides Function SaveViewState() As Object
        Session("__ISREFRESH") = mRefreshState
        Dim allStates(2) As Object
        allStates(0) = MyBase.SaveViewState()
        allStates(1) = Not mRefreshState
        Return allStates
    End Function

然后调用IsRefreshFromPostBack 属性来判断是否按下了F5。效果很好,我在很多应用中都使用过

【讨论】:

【参考方案3】:

您可能会记住会话状态中的最后一页,并且如果请求与您知道它已被刷新的页面相同。将此代码放在基页类的 OnInit 方法中(假设您有一个基页类)。检查它也不是 PostBack。

【讨论】:

我觉得这个方案还是有问题的,因为页面可以同时回发和刷新。例如:如果用户进行回发,然后刷新......现在请求将是回发并刷新。 是的,但是你可以通过记住 Session 中的两个值来处理这个问题:最后一页,以及它是否是回发。你的问题有点不寻常——你为什么要这样做? 谢谢 4 你的回应。原因是:我有一个页面,用户可以在其中更新记录的状态。然后他单击一个显示“更改状态”的按钮,然后单击我向他显示一个模式对话框,上面写着:“状态已更新为公开”。如果用户刷新此页面,再次看到“status updated to public”是没有意义的。

以上是关于检测页面刷新 jQuery 或 C# ASP.Net的主要内容,如果未能解决你的问题,请参考以下文章

在Javascript中检测浏览器刷新

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

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

如何在 jQuery 中强制页面刷新或重新加载?

AJAX和JQUERY实现部分刷新

在 C# 中防止页面刷新