我正在寻找一种在我的C#代码中检测页面是否已刷新的方法(f5)。
首先,我不知道jQuery / JavaScript解决方案是否比完全C#ASP.Net更好。所以...第一个问题是:什么会让你选择一个而不是另一个?
第三,也是最重要的部分,如果有人能帮助我。一些好的教程,或文章......任何东西。我尝试了一些解决方案......但也许,因为我缺乏知识,他们没有工作。
提前致谢。
我尝试使用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,这种情况使我之前的代码无效。 我仍然在寻求一个简单直接的解决方案。
答案 0 :(得分:1)
据我所知,大多数浏览器的浏览器刷新都不会发送任何特殊信息来指示按下了刷新按钮。但是,有一些选择,具体取决于您要完成的任务。
我建议您阅读以下内容,看看它们是否可以帮助您获得所需的位置:
只是一种直觉,但上面的第二项可能是您需要的路径。有时,解决问题的最佳方法是消除问题。也就是说,构建解决方案,以便推送刷新首先不需要特殊处理。
至于Javascript(客户端)与ASP.NET(服务器端),我认为你可能会结合两者的组合,而不是两者或。
答案 1 :(得分:1)
把它放到一个继承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。令人惊奇,我已在许多应用程序中使用
答案 2 :(得分:0)
您可能还记得会话状态中的最后一页,如果请求与您知道它已被刷新的页面相同。将此代码放在基页类的OnInit方法中(假设您有一个基页类)。检查它不是PostBack。