我有一个webforms页面,它广泛使用了AJAX。它上面有许多链接可以将用户带到另一个页面。如果用户使用浏览器的后退按钮返回页面,我想保持页面所处的状态。
我如何解决这个问题的方法是每次用户与页面交互时将页面的状态存储在会话中。当他们返回页面时,如果会话中存在状态,则会加载并显示给用户。
我有这种“有点”工作。页面保存正确,可以正确加载,但不幸的是需要页面刷新(F5)来加载它,否则它会回退到以前的状态。
知道为什么没有刷新就没有正确呈现页面?我怎样才能解决这个问题?
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
if (!Page.IsPostBack)
{
DataBindDropDowns();
if (HasQueryString())
{
SetOptionsFromQueryString();
SavePageToSession();
Response.Redirect("Default.aspx");
}
else
{
RestoreFromSession();
DisplayOptions();
}
}
}
答案 0 :(得分:0)
您是否使用'load'事件来初始化页面?当用户按下后退按钮时,'load'事件不会触发,但'dom content ready'事件会触发。
请参阅:
Is there a cross-browser onload event when clicking the back button?
如果你正在使用jQuery,尝试将你的页面初始化逻辑放在准备好的事件中,你应该很好。如果您不使用jQuery,请找到适当的方式来连接DOM Content Loaded / Ready事件并使用它来初始化您的页面。
如果仍然无效,请发布您的代码,以便我们调试问题。
修改强>
您希望设置相应的Expires标头,以便在单击后退按钮时浏览器将重新加载页面。尝试以下页面中的代码:
http://www.352media.com/rantingandraving/rave.aspx?raveid=325&id=212
答案 1 :(得分:0)
根据PageLoad没有解雇的问题,这是我的猜测...
我打赌.aspx文件正在使用缓存标头发送到客户端......
拉起Fire Bug或Fiddler并查看MaxAge http响应标头来自您的服务器。
如果是这样,那么您需要删除该内容,因为浏览器没有重新请求该文件,因为它被告知不要。
答案 2 :(得分:0)
HTML 5离线存储是另一种选择,非常令人惊讶,因为它可以在IE 8问世以来在所有主流浏览器中运行。
我做了一个jQuery插件,用于保存http://www.jasonsebring.com/dumbFormState的返回用户的表单状态,这些用户完成了你所谈论的大部分内容,与服务器端无关,甚至可以在HTML页面中工作。
我可以添加更多功能,例如完整保存表单,因此甚至不需要在其他页面上进行渲染。我专注于保存用户自动做出的实际选择,然后当用户回来时,表单选择仍然在他们停止的地方,您可以通过表单实例从会话或本地存储中删除它们。这是进入HTML 5的一个勇敢的新世界,随着新浏览器消除过去的问题,将会有许多旧的范例消失。保持表单状态肯定是一个巨大的问题,所有使用都希望消失。
JavaScript现在变得越来越强大,所以你应该获得那些HTML 5技能。我建议您阅读,聆听和观看Douglas Crockford的所有内容,因为您认真对待JavaScript的怀疑论将会消失,您会发现除了变量和函数之外,闭包是编程中最好的东西。