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

时间:2015-11-25 20:37:05

标签: json jqgrid free-jqgrid

回答

How to replace remapColums with remapColumnsByName in free jqgrid

包含保存和恢复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;

};

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

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

我尝试修复它添加colStates[cmName] !== undefined检查:

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

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

在已保存列列表中找不到的新列应显示在与colmodel中定义的相同位置。列顺序shoudl corrspond来自服务器的远程数据。

更新

ColModel在变量cm

的Razor视图中定义
     <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>

1 个答案:

答案 0 :(得分:0)

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

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