如果保存列状态,在服务器中定义新列并且在编辑中保存数据,则避免数据损坏

Avoiding data corruption if column state is saved, new column is defined in server and data is saved in edit

中回答

包含保存和恢复 jqgrid 列顺序的代码。

它包含恢复列状态的方法:

var restoreColumnState = function (colModel) {
  var colItem, i, l = colModel.length, colStates, cmName,
    columnsState = getObjectFromLocalStorage(myColumnStateName);

if (columnsState) {
    colStates = columnsState.colStates;
    for (i = 0; i < l; i++) {
        colItem = colModel[i];
        cmName = colItem.name;
        if (cmName !== "rn" && cmName !== "cb" && cmName !== "subgrid") {
                colModel[i] = $.extend(true, {}, colModel[i], colStates[cmName]);
        }
    }
}
return columnsState;

};

如果在服务器端定义了新列,此方法会导致从内联编辑中发布无效数据。

jqgrid 从远程 json 数据数组中填充。在此数组中,列必须与列状态中的列相同。 如果保存列状态并将新列添加到服务器代码中的 jqgrid, colStates[cmName] 值未定义。 此代码导致将新列添加到 jqgrid 列的末尾。但是,在 json 数据数组中,它出现在服务器中定义的列中。 在内联编辑中,如果行被保存,错误的值被分配给表单字段并且无效的值被传递到服务器。

我试图通过添加 colStates[cmName] !== undefined 检查来修复它:

        if (cmName !== "rn" && cmName !== "cb" && cmName !== "subgrid" && colStates[cmName] !== undefined) {

但问题仍然存在。 如何解决这个问题,如果新列被添加到服务器中的 jqgrid colmodel,恢复列状态允许保存正确的数据?

在保存的列列表中找不到的新列应该出现在与 colmodel 中定义的相同的相对位置。列顺序应与来自服务器的远程数据相对应。

更新

ColModel 在 Razor 视图中的变量 cm

中定义
     <script>
    var
        $grid,
          myColumnsState,
          isColState,
          myColumnStateName;

        $(function () {
            var cm= @Html.Raw(Model.GetColModel());
            $grid = $("#grid");
            myColumnStateName = @Model.ColumnStateName();
            myColumnsState = restoreColumnState(cm, myColumnStateName);
            isColState = typeof (myColumnsState) !== 'undefined' && myColumnsState !== null;
            $grid.jqGrid({
                page: isColState ? myColumnsState.page : 1,
                sortname: isColState ? myColumnsState.sortname : "",
                sortorder: isColState ? myColumnsState.sortorder : "",
        ....
                </script>

我知道这个问题很好! 需要在使用之前对先前保存的网格状态实施某种验证检查。检查的深度可能取决于您的应用程序的确切要求以及从信息中选择哪一个确切地知道。最开放和不清楚的事情:应该对以前保存的状态进行一些 correction/fixing 还是应该在第一个小错误时丢弃状态?问题的答案取决于使用 jqGrid 的项目。深度修复可能包括修复排序参数和修改以前保存的过滤器。另一个例子:状态可能包括所选行的 ID,但在常见情况下,修复部分状态可能不是个好主意。一次加载数据可能意味着选定行的一种设置,但加载另一数据(例如未过滤)可能确实有行,并且应该选择这些行。在这种情况下没有最好的选择,一切都取决于具体的项目要求。无论如何,状态 validation/fixing 的实现都不是简单的代码。

只是因为先前保存状态的验证问题的复杂性以及不同场景验证的存在我没有' t 在免费的 jqGrid 中实现了这样的功能。任何好的实现都需要时间,而且生成的代码也不会简单。对于一些典型的场景,它会有一些选项。我想在未来实施该功能,但我只是没有找到实施的时间,因为我必须做我的主要工作来为我的家人赚钱,我仍然试图帮助社区中的其他人对于个人来说,免费 jqGrid 的 jqGrid 有一些小但重要的问题。