当使用jqgrid时,无论如何都有recreateForm:true但是还缓存dataUrl?

时间:2014-02-20 00:13:15

标签: jquery asp.net-mvc caching jqgrid

我使用jqGrid(简化)

以下列
  { name: "PMOPerson", index: "PMOPerson", width: 250, editable: true, edittype: "select", editoptions: { dataUrl: "/Person/GetSelectData" }, editrules: { required: false} },

  { name: "HeadDisplayName", index: "HeadDisplayName", width: 150, editable: false },

当我通过调出编辑对话框来编辑一行时,需要10秒才能填充PMOPerson下拉列表。即使在我之前已经加载过一次之后也是如此,我认为这是因为我有recreateForm:在下面是

  addButton({
    caption: "",
    title: "Edit Selected Team",
    buttonicon: 'ui-icon-pencil',
    onClickButton: function () {
        var id = $("#grid").getGridParam("selrow");
        if (id) {

            jQuery("#grid").jqGrid('editGridRow', id,
                    { url: '/OrganisationalUnit/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
                    });
        }
    },
    position: "second"
});

我试图找出是否有一种方法可以同时使用recreateform:true但仍然会缓存dataUrl中的项目列表,以避免每次编辑行时都返回服务器。

1 个答案:

答案 0 :(得分:1)

我回答了非常接近的问题herehere。换句话说,您可以使用HTTP标头的缓存选项,也可以使用editoptions.value代替editoptions.dataUrl

我在the answer和前两个(thisthis)中描述了如何在editoptions.value回调中动态设置beforeProcessing。需要扩展来自用于填充网格的服务器的响应以及其他信息(使用从editoptions.dataUrl返回的数据等数据)。在我看来,它实现了editoptions.dataUrl数据缓存和重新加载网格刷新数据之间的最佳折衷。仍然可以在服务器端保存缓存的editoptions.dataUrl数据

或者,可以使用更简单的方法,在创建网格后向editoptions.dataUrl创建手动 Ajax请求,并且可以在{{1}内设置editoptions.value }(success)回调Ajax请求。代码将涉及以下

done

// create grid $("#grid").jqGrid({ colModel: [ { name: "PMOPerson" }, ... ], ... }); // make separate asynchronous Ajax request to the server and set // edittype: "select", editoptions: { value: ... } setSelectOptionValues("/Person/GetSelectData", $("#grid"), "PMOPerson"); 的代码取决于您用来与setSelectOptionValues等网址进行通信的JSON数据的格式。例如,如果服务器返回的字符串数组应该是"/Person/GetSelectData"的文本和选项的值,那么可能是以下

<select>

var setSelectOptionValues = function (getJsonUrl, myGrid, colModelColumnName) { $.getJSON( getJsonUrl, function (data) { var i, selectedOptions = '', datai, dn, colModelColumn; for (i = 0; i < data.length; i += 1) { if (i > 0) { selectedOptions += ';'; } else { selectedOptions = ""; } datai = data[i]; if (typeof datai === 'string') { selectedOptions += datai; selectedOptions += ':'; selectedOptions += datai; } } myGrid.jqGrid("setColProp", colModelColumnName, { edittype: "select", editoptions: { value: selectedOptions } }); } ); }; 的设置将在editoptions.value内以异步完成。因此,可以在设置setSelectOptionValues之前填充网格。另一方面editoptions.value将仅在编辑期间用于editoptions.value的响应时间通常足够快,在用户开始编辑之前,将设置值"/Person/GetSelectData"。如果你想绝对确定你仍然可以持有editoptions.value。如果editoptions.dataUrl仅在用户快速作为服务器并且在editoptions.dataUrl上进行响应时才会使用"/Person/GetSelectData"。您可以更改

的显式调用
setSelectOptionValues("/Person/GetSelectData", $("#grid"), "PMOPerson");

使用colModel获取getGridParam,循环浏览所有colModel项,并为setSelectOptionValues的所有项目调用editoptions.dataUrl

最后一种方法的主要限制:您不能使用formatter: "select"(仅限edittype: "select")。如果您使用ID填充网格数据,并且editoptions.valueformatoptions.value提供了ID到文本的映射,那么我建议您使用第一种方法进行beforeProcessing回调。