【问题标题】:ASP.NET Cached page. State is saved but requires refreshASP.NET 缓存页面。状态已保存但需要刷新
【发布时间】:2010-11-10 08:30:46
【问题描述】:

我有一个非常广泛地使用 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();
        }
    }
}

【问题讨论】:

  • 当您按下浏览器返回按钮时,服务器端页面 OnLoad 是否会触发?还是浏览器在没有从服务器重新请求页面的情况下渲染页面?
  • 好点! OnLoad 事件未触发...

标签: asp.net session caching


【解决方案1】:

您是否使用“加载”事件来初始化页面?当用户按下后退按钮时,'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

【讨论】:

  • 编辑了我的问题以显示代码。我是从后面的 .NET 代码而不是 javascript 执行此操作的。对不起,应该说得更清楚。
  • 嗯,根据您的页面过期设置,当用户单击返回按钮时,浏览器可能会或可能不会调用服务器端页面。如果您没有在代码中设置任何页面过期设置,那么它将具有默认过期时间,当用户按下后退按钮时,浏览器将不会从服务器请求页面,它将显示缓存副本并且您的 Load 事件不会火。
  • 我已经尝试过设置和不设置 Response.Cache.SetCacheability(HttpCacheability.NoCache)
  • 尝试使用 Expires 标头。示例:352media.com/rantingandraving/rave.aspx?raveid=325&id=212
  • 那个链接解决了我的问题,谢谢。你想编辑你的帖子来添加这个,我会把它标记为答案。
【解决方案2】:

这是我根据 PageLoad 未触发问题的猜测...

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

拉起 Fire Bug 或 Fiddler 并查看 MaxAge http 响应标头来自您的服务器。

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

【讨论】:

    【解决方案3】:

    HTML 5 离线存储是另一种选择,而且非常神奇,因为它适用于自 IE 8 推出以来的所有主要浏览器。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 2016-07-28
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多