0

我有一个 asp.net-mvc 站点,并且我正在使用jqgrid,并且我有几个字段,其中编辑控件是一个下拉列表。我有一个问题,下拉列表所依赖的名称来自另一列,因此每次打开编辑表单或单击“+”以添加新条目时,我都需要从服务器强制刷新确保显示正确的字符串。

我看到 Internet Explorer 似乎缓存我的下拉列表的问题,即使我非常努力地告诉它不要这样做。我没有在 Firefox 或 Chrome 中观察到这个问题。

这是我的代码:

我正在观察该问题的 Col MODEL 行:

     { name: "SiteSettings", index: "SiteSettings", width: 250, editable: true, 
      edittype: "select", editoptions: { dataUrl: "/SiteSettings/GetSelectData" }, 
      editrules: { edithidden: true, required: false} },

这是构造编辑按钮和添加按钮的代码

    onClickButton: function () {
        jQuery("#grid").jqGrid('editGridRow', "new", { recreateForm: true, url: '/MyController/Add', afterSubmit: function (response, postdata) {
            var responseJson = $.parseJSON(response.responseText);
            return HandleJqGridAddResponse(responseJson);
        }, height: 380, width: "auto", closeAfterAdd: true, reloadAfterSubmit: true
        });
    },

        jQuery("#grid").jqGrid('editGridRow', id,
                    { url: '/MyController/Update', afterSubmit: function (response, postdata) {
                        var responseJson = $.parseJSON(response.responseText);
                        return HandleJqGridResponse(responseJson);
                    },
                        height: 380, width: "auto", recreateForm: true, closeAfterEdit: true,
                        closeOnEscape: true, reloadAfterSubmit: true
                    });

我想

  recreateForm: true

或者

  $("#grid").jqGrid({
     ajaxSelectOptions: { cache: false }
  });

会做的伎俩,但它似乎没有任何区别。

但我观察到,当我打开编辑表单或新表单时,不会调用我后端的函数来返回下拉列表的项目列表,因此必须有一些客户端缓存。

每次尝试编辑或添加新条目时,如何强制刷新 dataurl ( dataUrl: "/SiteSettings/GetSelectData ")?

4

2 回答 2

1

jQuery.extend(jQuery.jgrid.edit, {recreateForm: true});应该在客户端为您工作

为了确保在服务器端和客户端都没有缓存,您可以装饰使用[OutputCache(NoStore = true)]属性检索数据的操作

于 2014-09-14T14:48:45.083 回答
1

我认为最糟糕的方法是在处理dataUrl( "/SiteSettings/GetSelectData") 的代码中在服务器端设置相应的 HTTP 标头。我个人会包括这条线

HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan (0));

或者

Response.Cache.SetCacheability (HttpCacheability.ServerAndPrivate);
Response.Cache.SetMaxAge (new TimeSpan (0));

作为GetSelectData行动的第一行/行。它将设置Cache-Control: private, max-age=0标头(参见此处),并且您将确保没有 Web 浏览器或 Web 代理会缓存服务器响应。

如果您更喜欢缓存选项的声明式设置,您可以使用

[OutputCache(Duration = 0)]

或者

[OutputCache(Duration = 0, Location = OutputCacheLocation.Client, VaryByParam = "*")]

我不确定哪些设置是最好的,但目标是设置Cache-Control: private, max-age=0标题。

于 2014-09-14T17:11:15.870 回答