如何防止IE缓存获取ajax请求结果

时间:2014-11-10 15:29:58

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

我在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>

其中主要显示一个dropdownlsit,它将在列表项更改时启动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中将不会遇到缓存问题?

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

    感谢。

3 个答案:

答案 0 :(得分: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.

        }
    });

答案 1 :(得分:2)

  1. 缓存持续时间由服务器设置指定,而不是IE。

  2. 所有浏览器以相同的方式缓存,但无法保证。

  3. Razor缓存应该解决服务器端,因为你有更多的选择和灵活性,而不是导致请求缓存的原因(例如,基于参数更改)。

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

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

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

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

答案 2 :(得分:0)

"?" + (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.

            }
        });