在AJAX请求后返回时显示旧数据

在AJAX请求后返回时显示旧数据,ajax,asp.net-core,Ajax,Asp.net Core,在使用asp.net core 1.0(mvc)编程商店时,我有以下场景: 我将3种产品添加到我的购物篮中 在购物篮上,我使用AJAX请求删除了3种产品中的一种。删除产品后,我将进入下一步,并重定向到带有“交货和付款”设置的页面 在带有交货和付款设置的页面上,我选择导航回购物篮。我希望看到2个产品,但我看到3个,因为页面还没有从服务器重新加载 当我检查fiddler时,我注意到没有执行对购物篮的各种资源的请求 在我的BaseController类中,我已经设置了以下应该禁用缓存的代码: [Non

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

  • 我将3种产品添加到我的购物篮中
  • 在购物篮上,我使用AJAX请求删除了3种产品中的一种。删除产品后,我将进入下一步,并重定向到带有“交货和付款”设置的页面
  • 在带有交货和付款设置的页面上,我选择导航回购物篮。我希望看到2个产品,但我看到3个,因为页面还没有从服务器重新加载
  • 当我检查fiddler时,我注意到没有执行对购物篮的各种资源的请求

    在我的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();
    }
    

    有人知道我们如何返回并看到只包含两种产品的最新购物篮吗?

    您可以简单地使用以下代码:

    <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>
    
    
    var pageKey=document.getElementsByTagName('head')[0].getAttribute(“数据页键”);
    var pageToken=document.getElementsByTagName('head')[0].getAttribute(“数据页标记”);
    var pageTokenCached=会话存储[pageKey];
    如果(!pageTokenCached | | pageTokenCached!==pageToken)会话存储.setItem(pageKey,pageToken);
    else location.reload();
    
    浏览器的会话存储只存储一个会话的数据。当用户关闭特定浏览器选项卡时,数据将被删除

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

    当用户单击browser BACK按钮时,html页面将从浏览器缓存中检索并执行。因此,缓存的令牌是从sessionStorage中检索的,与我们在页面中的内容相比,即数据页面令牌

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

    数据页令牌等于会话存储的令牌时,这意味着我们有一个过时的页面,因此它被重新加载,否则将被处理


    会话存储与所有浏览器兼容,并且受IE 8.0支持。您只需使用以下代码即可:

    <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>
    
    
    var pageKey=document.getElementsByTagName('head')[0].getAttribute(“数据页键”);
    var pageToken=document.getElementsByTagName('head')[0].getAttribute(“数据页标记”);
    var pageTokenCached=会话存储[pageKey];
    如果(!pageTokenCached | | pageTokenCached!==pageToken)会话存储.setItem(pageKey,pageToken);
    else location.reload();
    
    浏览器的会话存储只存储一个会话的数据。当用户关闭特定浏览器选项卡时,数据将被删除

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

    当用户单击browser BACK按钮时,html页面将从浏览器缓存中检索并执行。因此,缓存的令牌是从sessionStorage中检索的,与我们在页面中的内容相比,即数据页面令牌

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

    数据页令牌等于会话存储的令牌时,这意味着我们有一个过时的页面,因此它被重新加载,否则将被处理


    会话存储与所有浏览器兼容,并且受IE 8.0支持。我建议您在删除时返回产品列表,并重新填充视图。“后退”按钮将重新加载上次页面上的内容。或者,如果您不担心紧缩,只要ajax请求成功,就可以手动删除删除的项目。我建议您在删除时返回产品列表,并重新填充视图。“后退”按钮将重新加载上次页面上的内容。或者,如果您不担心紧缩,只要ajax请求成功,就可以手动删除删除的项目。这是非常聪明的!这真是太聪明了!