ASP.NET WebForms:重定向后再用浏览器后退返回时,页面数据未清除
我有一个ASP.NET WebForms页面,在清空所有页面数据后再把用户重定向到另一个页面:
protected void btnNavigate_Click(object sender, EventArgs e)
{
ClearPageData();
Response.Redirect("https://example.com/anotherpage");
}
private void ClearPageData()
{
txtUserName.Text = string.Empty;
txtNR.Text = string.Empty;
tbfUser.Text = string.Empty;
// ... reset other controls and page state
}
问题
当用户按浏览器“后退”按钮返回到该页面时,之前清空的数据全都重新出现。看起来浏览器是从缓存或历史记录中还原该页面。即使尝试在 Page_Load 清理页面也没用,因为 Page_Load 在用“后退”按钮返回时不会执行。
提问
如何确保当用户在重定向后返回该页面时,页面确实被清空,不会显示旧数据?
解决方案
下面给出几种用JavaScript处理的选项:
- 你可以像在这个回答中那样,检测页面是否是从浏览器历史记录导航而来:this answer。
- 另一种选择是显示一个面板(或者如果你在服务器端没有要执行的操作,只是一个按钮),用JavaScript告诉它进行重定向并从导航历史中移除当前页面:
window.location.replace('your-link');
下面的这段代码将用于检测显示的页面是从缓存中加载而不是从服务器加载,例如如果它是来自前进/后退导航,因为这正是我在我的应用中需要的。
document.getElementsByTagName("BODY")[0].onpageshow = function() {
if (event.persisted) {
alert('Please refresh');
//your code here for what to do if page gets displayed from cache
}
};
onpageshow 事件在页面显示时发生,因此在导航时也能正常工作。event.persisted 是一个只读属性,表示网页是否正在从缓存加载。当我需要做类似的事情时,这正成为我的完美解决方案。
为什么你的代码没有清除字段
当一种方法进行重定向时,浏览器得到的唯一指示就是要重定向。它不能传递需要让你的页面重置的信息。
备选方案
我会简单地添加代码来检测页面是否被后退按钮重新加载,如果是,就清空字段。
因此,标记可以写成如下:
<h3>First Name</h3>
<asp:TextBox ID="txtFirst" runat="server" ClientIDMode="Static"></asp:TextBox>
<h3>Last Name</h3>
<asp:TextBox ID="txtLast" runat="server" ClientIDMode="Static"></asp:TextBox>
<h3>City</h3>
<asp:TextBox ID="txtCity" runat="server" ClientIDMode="Static"></asp:TextBox>
<br />
<br />
<br />
<asp:Button ID="cmdSubmit" runat="server" Text="Submit"
OnClick="cmdSubmit_Click"
/>
<script>
window.addEventListener("pageshow", function (event) {
if (event.persisted) {
// Page was restored from bfcache
txtFirst.value = ""
txtLast.value = ""
txtCity.value = ""
}
});
</script>
这样,当你点击后退按钮时,上面的清空文本框的代码就会执行,因此如果用户再次点击后退按钮,你的文本框就会被清空,你就不会看到奇怪的提示。
上面的结果看起来像这样:
当然,在上面,我使用的是更新的浏览器端代码格式,因此不需要jQuery,并且在上述JavaScript中也不需要GetElementbyID,因为我已经指定了clientidmode="static"。
因此,只要简单地添加/包含上述代码,在你返回且浏览器“尝试”使用缓存时,上面的代码就会运行并清空文本框。
按钮背后的服务器端代码是这样的:
' code here to process the controls and pae
Protected Sub cmdSubmit_Click(sender As Object, e As EventArgs)
Response.Redirect("MyPage2.aspx")
End Sub
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
