当用户使用浏览器后退/前进按钮到达某些页面时如何避免 Page_Load

问题描述 投票:0回答:1

我想通过单击浏览器的后退/前进按钮将用户重定向到另一个页面。我找到了一个 JavaScript 解决方案,如下所示。 (这是一个简化的示例,没有映射要重定向到的 URL。)

if(is_safe(window.location.href))
    return;
if (window.performance.getEntriesByType("navigation")[0].type === "back_forward")
    window.location.href = "/Home.aspx";

这工作得很好,除了它发生在客户端,即after

Page_Load
我想避免整个
Page_Load
事件,或者至少在用户到达某些页面时只能运行其中的一部分
,因为许多页面都有
Page_Load
事件实际发布数据库更改(我知道......这不好)。另外,即使情况并非如此,当用户无论如何都会被重定向到另一个页面时,最好避免加载数据。

如何实现这个目标?


编辑:当他们单击后退按钮时,我没有从源重定向或检测导航类型,因为这是不可能的或非常不一致。在某些时候,当我还没有弄清楚这个 JavaScript 解决方案时,我什至尝试过两次重定向用户,但都不起作用,因为浏览器会在单击后退按钮时跳过重定向并发布。如果可以从源头重定向或检测,我将非常乐意得到纠正! PRG 模式是为了避免双重提交而遵守的,但我认为这与这里无关。

javascript c# .net navigation .net-4.8
1个回答
0
投票

我认为 history.replaceState() 足以实现目标(如果用户通过后退/前进按钮到达某些页面,请避免 Page_Load 事件)。这里的关键是,使用

replaceState
修改当前状态的 URL 不会导致页面根据新的 URL 重新加载。 (这是有意的,因为此方法的目的是将文档的附加 URL 重写为目标 URL。)

但是,这种方法的一个很大的限制是,如果用户单击刷新,它将根据替换的 URL 加载页面。由于点击刷新算作回发,可以通过

!Page.IsPostBack
中的
Page_Load
检测到,因此可以允许此操作。这种方法牺牲了用户点击刷新并停留在 URL 被修改的页面的同一页面上的能力。

此外,由于浏览器地址栏中显示的URL也会发生变化,因此如果用户需要查看页面的URL,他们将看到不正确的URL(目标URL)。

function handleUnsafePage() {
  const unsafePages = {
    "/pages/unsafeOperation": "/pages/unsafeOperationList"
  }
  const currentPath = location.pathname;
  if (currentPath in unsafePages)
    history.replaceState({id: `${currentPath} replaced`}, "", unsafePages[currentPath]);
}
© www.soinside.com 2019 - 2024. All rights reserved.