在AJAX请求之后导航回来时会显示旧数据

时间:2017-01-04 16:55:59

标签: ajax asp.net-core

使用asp.net core 1.0(mvc)编程商店时,我有以下场景:

  1. 我在商店购物篮中添加了3件商品。
  2. 商店购物篮中的
  3. 我使用AJAX请求删除了3个产品中的一个。在删除产品后,我继续进行下一步,并重定向到带有交付和放大的页面。付款设置
  4. 在页面上发送&付款设置我选择导航回购物篮。我希望看到2个产品,但我看到3,因为页面还没有从服务器重新加载。
  5. 当我检查提琴手时,我注意到没有对商店购物篮的各种资源提出要求。

    在我的BaseController类中我已经设置了以下代码来禁用缓存:

    [NonAction]
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {  
        context.HttpContext.Response.Headers.Add("Cache-Control", "no-store, must-revalidate");
        context.HttpContext.Response.Headers.Add("Expires", "0");
        context.HttpContext.Response.Headers.Add("Pragma", "no-cache");
    
        await next();
    }
    

    有没有人知道我们如何导航回来看到只包含2种产品的最新购物篮?

1 个答案:

答案 0 :(得分:3)

你可以使用这段简单的代码:

<head data-page-key="@string.Concat(this.ViewContext.RouteData.Values["controller"], @"_", this.ViewContext.RouteData.Values["action"])"
      data-page-token="@DateTime.Now.Ticks.ToString()">

    <script type="text/javascript">
        var pageKey = document.getElementsByTagName('head')[0].getAttribute("data-page-key");
        var pageToken = document.getElementsByTagName('head')[0].getAttribute("data-page-token");
        var pageTokenCached = sessionStorage[pageKey];
        if (!pageTokenCached || pageTokenCached !== pageToken) sessionStorage.setItem(pageKey, pageToken);
        else location.reload();
    </script>

浏览器的 sessionStorage 仅存储一个会话的数据。当用户关闭特定浏览器选项卡时,将删除数据。

每次页面来自服务器时,都会生成一个新的数据页面标记值,存储在标记中并保存在浏览器的sessionStorage中。

当用户点击浏览器BACK botton时,将从浏览器缓存中检索html页面并执行。因此,从sessionStorage中检索缓存的令牌,与我们在页面中的内容进行比较,即 data-page-token

如果值相等,则表示该页面来自浏览器缓存,否则它是来自服务器的页面。

data-page-token 等于 sessionStorage的令牌时,这意味着我们有一个陈旧的页面,因此重新加载,否则将被处理。

会话存储与所有浏览器兼容,并且也受IE 8.0支持