ASP.NET缓存页。状态已保存,但需要刷新

ASP.NET缓存页。状态已保存,但需要刷新,asp.net,session,caching,Asp.net,Session,Caching,我有一个webforms页面,它非常广泛地使用AJAX。上面有许多链接,可以让用户转到不同的页面。如果用户使用浏览器的“后退”按钮返回页面,我希望保持页面的状态 我是如何做到这一点的,每次用户与页面交互时,都将页面的状态存储在会话中。当它们返回页面时,如果会话中存在状态,则会加载状态并向用户显示 我有这种工作。页面已正确保存,并且可以正确加载,但不幸的是,需要页面刷新(F5)才能加载页面,否则会返回到以前的状态 你知道为什么没有刷新页面就不能正确呈现吗?我怎样才能着手解决这个问题 protect

我有一个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();
        }
    }
}

是否使用“加载”事件初始化页面?当用户按下后退按钮时,“加载”事件不会触发,但“dom内容就绪”事件会触发

见:

如果您使用的是jQuery,请尝试将页面初始化逻辑放在ready事件中,这样应该很好。如果不使用jQuery,请找到适当的方法连接到DOM内容加载/就绪事件,并使用它初始化页面

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

编辑:

看起来您希望设置适当的Expires标头,以便在单击“上一步”按钮时浏览器将重新加载页面。请尝试以下页面中的代码:


以下是我根据PageLoad未启动问题的猜测

我打赌.aspx文件正在发送到带有缓存头的客户端

打开Firebug或Fiddler,看看MaxAge http响应头是否来自您的服务器


如果是这样的话,这就是你需要删除的内容,因为浏览器没有重新请求文件,因为它被告知不要重新请求文件。

HTML5脱机存储是另一种选择,而且非常令人惊讶,因为自IE 8问世以来,它在所有主流浏览器中都能工作

我做了一个jQuery插件,用于保存表单状态以返回用户,它完成了您所谈论的大部分内容,与服务器端无关,甚至可以在HTML页面中工作

我还可以添加一些其他功能,例如保存整个表单,这样就不需要在额外的页面点击中呈现表单。我的重点是保存用户自动做出的实际选择,然后当用户返回时,表单选择仍然保留在停止的位置,您可以根据需要通过表单实例从会话或本地存储中删除它们。这是进入HTML5的一个勇敢的新世界,随着新浏览器消除过去的问题,许多旧的范例将消失。维护表单状态当然是一个巨大而古老的问题,所有的用户都希望它消失


JavaScript现在越来越强大,所以你应该掌握HTML5的技能。我建议您阅读、聆听和观看Douglas Crockford的所有内容,因为您对认真对待JavaScript的怀疑将烟消云散,您将发现闭包是编程中除了变量和函数之外最好的东西。

编辑了我的问题以展示代码。我是通过.NET代码来实现的,而不是javascript。很抱歉,应该说得更清楚。好吧,根据您的页面过期设置,当用户单击“上一步”按钮时,浏览器可能会调用服务器端页面,也可能不会调用服务器端页面。如果您的代码中没有设置任何页面过期设置,那么它将有一个默认过期,当用户按下“上一步”按钮时,浏览器将不会从服务器请求页面,它将显示缓存的副本,您的加载事件将不会触发。我已经尝试了此操作,有响应和无响应。Cache.SetCacheability(HttpCacheability.NoCache)setTry使用Expires头。这个链接解决了我的问题,谢谢。您是否要编辑您的帖子以添加此内容,我将此标记为答案。当您按下broswer back按钮时,服务器端页面是否会启动OnLoad?或者浏览器呈现页面时没有从服务器重新请求页面?这一点非常好!加载事件未触发。。。