【问题标题】:how to prevent IE from caching get ajax request results如何防止IE缓存获取ajax请求结果
【发布时间】:2015-01-06 22:55:54
【问题描述】:

我的 asp.net mvc 视图中有以下内容:-

 <div class=" b" >Show   @Html.DropDownList("type", new SelectList(ViewBag.type, "Value", "Text", "" ), new { @id= "typeOptions",@class="SmallDropDown3"}) Requestors.
                        <img src="~/Content/sortloading.gif" class="loadingimage" id="progressSort3" /></div>  

@Html.Partial("_GetRequestors", Model)
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
<script>
        $("body").on('change', '#typeOptions', function () {


            $('#progressSort3').show();

            $.ajax({
                type: "Get",
                url: '@Url.Action("GetRequestors","Customer")',

                data: { id: "@ViewBag.AccountID", page: "1", type: $("#typeOptions").val() },

                success: function (html) {
                    $('#RequestorTable').html(html);
                    $('#progressSort3').hide(); //This could also be dialog("open") depending on the version of jquery ui.

                }
            });
        });
    </script>

主要显示一个下拉菜单,当列表项发生变化时,它将启动一个 Ajax 调用。这是将被调用的操作方法:-

 public ActionResult GetRequestors (int id = 0,int page=1,string type="")
        {
            int pagesize;
            ViewBag.type = ViewBag.PagedSizeOptions = new PageOptions().RequestorTypeOptions;
            bool succeed = int.TryParse(System.Web.Configuration.WebConfigurationManager.AppSettings["TechPageSize"], out pagesize);
           var aUser = repository.populateRequestorDetials2(id,type).OrderBy(a=>a.FIRST_NAME).ToPagedList(page, pagesize);

           ViewBag.AccountID = id;
           ViewBag.currenttype = type;
           if (Request.IsAjaxRequest())
           {

               return PartialView("_GetRequestors", aUser);
           }
           return View(aUser);
  }

目前看来IE会长时间缓存结果,而且在更改dropdpwnlist时IE总是会显示同一个下拉项的缓存结果,即使硬刷新(ctrl-f5)也不会删除缓存结果... 所以我主要有这两个问题:-

  1. IE 会将缓存数据保留多长时间?

  2. 我知道我可以添加 cache:false 作为 ajax 参数。但问题是如果我没有在我的 IE 的 Ajax 调用中指定任何缓存设置,那么默认行为是什么。在chrome和firefox中不会遇到缓存问题吗?

任何人都可以就这些问题提出建议吗?

谢谢。

【问题讨论】:

  • 添加一个随机 uuid 作为 url get 参数怎么样?
  • 使用 Razor,您应该使用您的操作方法上的各种属性在服务器端“修复”它。大多数 Ajax 解决方案不会针对服务器缓存要求进行微调(您可以对服务器进行更多控制)。

标签: jquery ajax asp.net-mvc caching razor


【解决方案1】:
  1. 缓存持续时间由您的服务器设置指定,而不是 IE。

  2. 所有浏览器应该以相同的方式缓存,但不能保证。

Razor 缓存应该解决服务器端,因为您有更多的选择和灵活性来决定是否缓存请求(例如,基于参数更改)。

停止缓存的最简单选项是在部分视图操作中添加以下内容:

[OutputCache(Duration = 1)]
public ActionResult GetRequestors (int id = 0,int page=1,string type="")

这会将缓存设置为 1 秒。 0 不是局部视图的有效选项。

注意:我假设您的代码返回部分视图。完整页面视图的选项不同(更简单)

【讨论】:

  • 是的,我知道我可以定义一个缓存配置文件并将其应用于我的操作方法,或者在 ajax 请求参数中使用 cache:false。但我的问题是,当我不添加任何自定义代码来控制缓存时,IE 将继续缓存结果多长时间?你提到缓存是由服务器指定的,所以你能建议什么控制这个吗?这是在我托管我的应用程序的 IIs 内吗?
  • 这是一个 IIS 设置,您也可以在 web.config 中全局覆盖它。现在只是为您寻找一个好的参考。
  • 但是为什么这个缓存设置不影响 Firefox 和 chrome 呢?因为在我的情况下,我既没有使用“cache:false”作为 Ajax 参数,也没有在我的操作方法中添加缓存配置文件。但是,即使我选择相同的下拉列表项,Firefox 和 chrome 也不会缓存任何内容,而在 IE 上,它会长时间使用缓存的数据(不确定多长时间......)。你能建议吗?
  • 所以我主要想知道是什么迫使 IE 缓存结果,即使我没有指定任何东西来强制浏览器缓存,正如我之前提到的那样。所以这提出了一个问题,即 IE 将缓存 Ajax 响应多长时间?有没有办法控制这个? .我的问题不是我如何启用/禁用缓存,我要问的是在我的情况下没有定义缓存设置时,什么控制 IE 的缓存?
  • @john G 你一遍又一遍地问同样的问题并得到同样的答案。在我的 cmets 中,我回答了为什么。我还回答了多长时间(但感觉就像缓存一样长)。控制缓存是启用和禁用缓存,您可以在此处控制的唯一其他设置是有几种缓存方法的时间,此处解释最多。您没有从这些答案/讨论中得到什么价值?
【解决方案2】:

您可以使用ajaxSetup 来防止缓存。

示例

$.ajaxSetup({ cache: false });

或者,如果您只是为了该请求而需要它,您可以:

$.ajax({
        type: "Get",
        cache: false,
        url: '@Url.Action("GetRequestors","Customer")',
        data: { id: "@ViewBag.AccountID", page: "1", type: $("#typeOptions").val() },
        success: function (html) {
            $('#RequestorTable').html(html);
            $('#progressSort3').hide(); //This could also be dialog("open") depending on the version of jquery ui.

        }
    });

【讨论】:

  • 我不记得了.. jQuery 是否做了一些工作来确保 URL 中带有查询字符串的安全?
  • @har0ld 来自 api.jquery.com/jQuery.ajax/#options It works by appending "_={timestamp}" to the GET parameters.
  • 是的,这就是我所说的。但是如果 URL 已经附加了查询,jQuery 是否足够聪明?我只问回 OP 正在使用 razor,并且有可能(我很确定)URL 构建器可以将它自己的查询放在 URL 的末尾。
  • @ColinBacon 我最初的问题不是关于如何禁用缓存。,我问的是当我没有指定缓存时,IE 将保持缓存数据多长时间:false,以及什么控制这个? ?
  • @har0ld 你说的“jQuery 是否会做一些工作以确保 URL 中包含查询字符串的安全”是什么意思?
【解决方案3】:

"?" + (new Date()).getTime() 添加到您的网址末尾。

即:

$.ajax({
            type: "Get",
            url: '@Url.Action("GetRequestors","Customer")' + "?" + (new Date()).getTime(),

            data: { id: "@ViewBag.AccountID", page: "1", type: $("#typeOptions").val() },

            success: function (html) {
                $('#RequestorTable').html(html);
                $('#progressSort3').hide(); //This could also be dialog("open") depending on the version of jquery ui.

            }
        });

【讨论】:

  • 但是如果我不添加任何额外的代码来管理缓存,IE 会在多长时间内使用缓存的数据?
  • @john G 我知道这是一个相当模糊和否定的答案,但只要感觉像它。 IE 不能很好地处理缓存和代理,因此如果有一个代理正在执行缓存的实例,那么 IE 似乎并不尊重 etags 等。对于高变化数据(比几天更频繁)的最佳选择是使用时间参数。这是一个斗志昂扬的黑客,但我们必须处理一些事情。如果有人想分享更多关于这方面的信息,请随意
  • 但我的问题是,如果我没有指定任何东西来控制缓存,那么 IE 将继续检索 ajax 请求的缓存结果多长时间?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 2011-05-17
  • 2012-09-29
  • 2014-06-17
  • 2011-02-20
相关资源
最近更新 更多