14

我需要查找用户是单击浏览器后退按钮还是刷新按钮。

当他单击返回或刷新按钮时,我需要将页面重定向到错误页面。这该怎么做。

我需要在 javascript 中为我的 ASP.net 页面执行此操作

4

8 回答 8

12

首先,如果用户使用 Back 或出于某种原因必须刷新页面,则给出错误消息是一个非常糟糕的主意。相反,您应该透明地处理它。考虑一下由于运输级别的问题而没有完全显示的页面 - 用户唯一的选择是重新加载或返回。

要回答您的问题,您必须自己跟踪用户的导航,这意味着在服务器端。忘记这里的java脚本。如果用户访问一个网站,您可以将该信息存储在与该用户关联的 Session 中(有几种方法可以保留这些唯一的 Session,我在此不再赘述)。如果您将用户最近访问的页面存储在内部结构中,则很容易确定一个页面被访问了两次,或者导航进入了“错误”的方向。

通过构建“允许”导航图并在用户访问时遍历它,您可以轻松地概括这一点(并使整个事情更加健壮,例如防止用户在 url 之间疯狂跳跃,或一次返回不止一个步骤)网站。

如果用户进行“错误”导航(例如后退,重新加载 == 访问两次),那么正确的行为是让他回到正轨。不要给他无法逃脱的错误信息!由于不允许他重新加载或返回,他别无选择。

于 2008-11-15T06:49:35.690 回答
5

你不能。浏览器不会将它自己的 ui 事件发送到服务器。你得到的只是http请求,一个看起来很像另一个。也许是点击了后退按钮,或者他们只是重新输入了最后一个 url。告诉我们它导致了什么问题,我们可以帮助您调整您的项目以更好地使用 http 协议。

于 2008-11-15T05:53:08.190 回答
5

使用存储在会话中的 guid/或时间戳实现 PageToken,并将该值与表单上的隐藏字段进行比较。我通过PageToken Class做到了这一点。如果隐藏字段中的值和会话变量不匹配,那么您就不同步了,您可以处理它。诀窍是映射页面上的所有事件。

public void GeneratePageToken()
{
    SessionVariables currSession = new SessionVariables();
    hfMasterPageToken.Value = System.DateTime.Now.ToString();
    currSession.PageToken = hfMasterPageToken.Value;
}

public string GetLastPageToken
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return currSession.PageToken;
    }
}

public bool TokensMatch
{
    get
    {
        SessionVariables currSession = new SessionVariables();
        return (currSession.PageToken != null
            && currSession.PageToken == hfMasterPageToken.Value);
    }
}

在常规代码之前的 Event 方法中:

if (this.TokensMatch == false)
{
    //Reload the data.
    //Generates a NewPageToken (this.GeneratePageToken();)
    ReloadDataMethod();
    this.MessageToUser =
     "Data reloaded.  Click Edit or Insert button to change.";
    this.MessageType = MessageToUserType.Success;
    this.DisplayMessageToUser = true;
    return;
}
于 2012-05-04T19:39:00.073 回答
3

Site.Master

在你的Site.Master,放在后面<body>

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<dx:ASPxLoadingPanel ID="MainLoadingPanel" runat="server" ClientInstanceName="MainLoadingPanel" Modal="True" />
<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    MainLoadingPanel.Show();
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            MainLoadingPanel.Hide();
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>

没有Site.Master

在您的通用代码中,放在后面<body>

<input type="hidden" id="refreshed" value="no" />
<script type="text/javascript" language="javascript">
    window.onload = function () {
        var e = document.getElementById("refreshed");
        if (e.value == "no") {
            e.value = "yes";
        } else {
            e.value = "no";
            location.reload(true); // Reload the page or redirect...
        }
    };
</script>
于 2014-04-01T14:25:11.923 回答
1

我想您想这样做是因为回发以避免重新提交某些操作或数据,对吗?具有讽刺意味的是,在 asp.net webforms 之前,这并不是什么大问题……因为您通常必须发布到不同的 URL 而不是同一个(实际上很像 asp.net mvc)。

我喜欢使用的一个技巧......即使在最技术性的点上速度较慢......是有一个输入页面和一个帖子页面。帖子页面的 HTML 输出是一些超级最小的 HTML,带有一个很小的 ​​javascript,它将浏览器历史记录中的当前 url(帖子页面)替换为结果页面(或者甚至是原始引用页面,如果你真的想要的话)。结果是当用户单击后退按钮时,他将被发送到原始输入页面,或者如果他单击刷新,他已经在新的结果页面上。

<html><body onload="location.replace('someURL.asp')"></body></html>
于 2008-11-15T06:52:46.213 回答
1

我们在 Java/Struts1 中通过在提交按钮上放置一个属性来做到这一点。如果单击提交按钮,按钮文本将在 ActionForm 的属性中发送。如果用户刷新信息,则该值未设置,因此我们知道用户没有单击该按钮。在这种属性为空的情况下,我们返回并呈现页面流的第一页。ASP.Net 中的 YMMV。

于 2009-01-17T03:55:04.020 回答
1

这只是检测用户是否使用后退/前进按钮登陆您的页面......唯一的问题是 IE8 及更低版本,浏览器版本无法处理此问题。

if(performance.navigation.type == 2)
{
    //Do your code here
}
于 2019-04-12T14:31:00.120 回答
0

.NET 3.5 可以很好地处理浏览器的后退(和前进)按钮。使用 Google 搜索:“Scriptmanager EnableHistory”。您可以控制哪些用户操作会将条目添加到浏览器的历史记录(ScriptManager -> AddHistoryPoint),并且只要用户单击浏览器的后退/前进按钮,您的 ASP.NET 应用程序就会收到一个事件。

于 2009-08-27T07:25:16.090 回答