2009-07-13 127 views
0

我有一个webforms页面,可以非常广泛地使用AJAX。其上有许多链接可将用户带到不同的页面。如果用户使用浏览器的后退按钮回到页面,我希望保持该页面所处的状态。ASP.NET缓存页面。状态已保存,但需要刷新

我如何去解决这个问题,就是每次用户与页面交互时,都会将页面的状态存储在会话中。当他们返回到页面时,如果会话中存在状态,则会将其加载并显示给用户。

我有这种“种”的工作。页面保存正确,并且可以正确加载,但不幸的是需要页面刷新(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

服务器端页面按下broswer后退按钮时是否触发?或者是浏览器渲染页面而无需重新从服务器请求页面? – BigBlondeViking 2009-07-13 16:33:07

+0

优秀点! OnLoad事件不会触发... – Kirschstein 2009-07-13 16:39:52

回答

0

您是否使用'load'事件来初始化页面?当用户按下后退按钮时,'load'事件不会触发,但'dom content ready'事件会发生。

参见:

Is there a cross-browser onload event when clicking the back button?

如果您正在使用jQuery,尽量把你的页面初始化逻辑ready事件,你应该是好的。如果您不使用jQuery,请找到合适的方法来连接DOM Content Loaded/Ready事件并使用它来初始化您的页面。

如果它仍然不起作用,请发布您的代码,以便我们可以调试问题。

编辑:

看起来要设置合适的Expires头,使浏览器将刷新页面点击后退按钮时。从下页try代码:

http://www.352media.com/rantingandraving/rave.aspx?raveid=325&id=212

0

这是基于了我的猜测pageLoad的问题不费一枪......

我敢打赌,.aspx文件被发送到客户端缓存头。 ..

拉起Fire Bug或Fiddler,并看到它MaxAge http响应头来自你的服务器。

如果是这样,那么您需要删除,因为浏览器不重新请求文件,因为它被告知不会。

0

HTML 5离线存储是另一种选择,而且相当了不起,因为它自IE 8推出以来在所有主流浏览器中均可用。

我做了一个jQuery插件,用于在http://www.jasonsebring.com/dumbFormState上为返回的用户保存表单状态,它完成了你正在谈论的大部分内容,并且与服务器端无关,甚至可以在HTML页面中工作。

我还可以添加一些其他功能,例如将整个表单保存起来,以便它甚至不需要在额外的页面命中时渲染。我关注于保存用户自动创建的实际选择,然后当用户返回时,表单选择仍然停留在哪里,您可以通过表单实例从会话或本地存储中删除它们。这是一个进入HTML 5的勇敢的新世界,随着新的浏览器消除过去的问题,将会有许多旧的范式消失。保持表格状态当然是一个巨大而古老的问题,所有的使用都希望消失。

JavaScript现在变得越来越强大,因此您应该掌握HTML 5技能。我建议您阅读,聆听和观看Douglas Crockford的所有内容,因为您认真对待JavaScript的怀疑态度将会消失,您会发现闭包是除编程变量和函数之外编程时创造的最好的东西。