如何从jqgrid json数据中删除额外的列值

时间:2015-12-05 15:39:44

标签: json asp.net-mvc jqgrid free-jqgrid

免费的Jqgrid有动作栏。 colmodel:

{"hidden":false,"label":"","name":"_actions","width":72
,"align":"left","template":"actions","fixed":false,"resizable":true,
  "formatoptions":{"editbutton":true,"delbutton":true,"delOptions":{"url":"Delete" }}},

{"label":"Nimetus","name":"Nimi","index":"Nimi","editoptions":{"maxlength":80,"size":80 }

它是从远程json数据填充的,如

{"total":1,
 "page":1,
  "rows":[{"id":"2ARVELDUSARV", "cell":[null,"2ARVELDUSARV"]},
          {"id":"ACME","cell":[null,"ACME"]},
          {"id":"KAKSKOERA","cell":[null,"KAKSKOERA"]}
 ]
}

在单元格数组中,不使用第一列。 如果删除此列,则jqgrid无法正确呈现数据,因为需要此列存在作为操作列的占位符。 如何解决这个问题,以便jqgrid接受没有第一列的数据:

{"total":1,
 "page":1,
  "rows":[{"id":"2ARVELDUSARV", "cell":[null,"2ARVELDUSARV"]},
          {"id":"ACME","cell":["ACME"]},
          {"id":"KAKSKOERA","cell":["KAKSKOERA"]}
 ]
}

更新

我按照回答中的建议查找数据格式更改。 使用下面的代码从ASP.NET MVC4中的sql select语句创建jqgrid数据。 Web API将其序列化为json格式的json格式自动格式化。

如何创建可以序列化为propertyname的结果:回答中推荐的值格式?

  object GetDataForJqGrid() {
        IDbConnection conn;
        using (var dataReader = DataAccessBase.ExecuteReader(sql.ToString(), out conn,
               CommandBehavior.CloseConnection | CommandBehavior.SingleResult,
               sql.GetParameters.ToArray()))
        {
            var rowList = new List<GridRow>();
            var pkeys = DatabasePrimaryKey();
            while (dataReader.Read())
            {
                var pkv = new List<object>();
                int offset = 1; // required for actions column
                var row = new GridRow
                {
                    id = IdHelper.EncodeId(pkv),
                    cell = new object[dataReader.FieldCount + offset + imageCount]
                };
                for (int j = 0; j < dataReader.FieldCount; j++)
                   row.cell[offset + j] = dataReader.GetValue(j);
                rowList.Add(row);
            }

            return new
            {
                total = rowList.Count() < rows ? page : page + 1,                                  page, 
          rows = rowList
            };
}

public class GridRow
{
    public string id;
    public object[] cell;
}

1 个答案:

答案 0 :(得分:1)

最简单的方法是将服务器返回的数据格式用于使用repeatitems: false数据样式。我指的是

的用法
{
    "total": 1,
    "page": 1,
    "rows": [
        { "id": "2ARVELDUSARV", "Nimi": "2ARVELDUSARV" },
        { "id": "ACME", "Nimi": "ACME" },
        { "id": "KAKSKOERA", "Nimi": "KAKSKOERA"}
    ]
}

或将key: true添加到列Nimi

的定义后
{
    "total": 1,
    "page": 1,
    "rows": [
        { "Nimi": "2ARVELDUSARV" },
        { "Nimi": "ACME" },
        { "Nimi": "KAKSKOERA"}
    ]
}

而不是

{
    "total": 1,
    "page": 1,
    "rows": [{
        "id": "2ARVELDUSARV",
        "cell": ["2ARVELDUSARV"]
    }, {
        "id": "ACME",
        "cell": ["ACME"]
    }, {
        "id": "KAKSKOERA",
        "cell": ["KAKSKOERA"]
    }]
}

或者,可以将jsonReader: { repeatitems: false }事件与您当前的数据格式一起使用,并添加jsonmap:&#34; cell.0&#34; property to,表示从数组cell获取第一个元素(索引0):

$("#list").jqGrid({
    datatype: "json",
    url: "andrus.json",
    colModel: [
        { label: "", name: "_actions", template: "actions" },
        { label: "Nimetus", name: "Nimi", jsonmap: "cell.0" }
    ],
    iconSet: "fontAwesome",
    jsonReader: { repeatitems: false }
});

请参阅the demo

我个人建议您不要使用原始格式(cell包含值数组)并仅使用带有其他id属性的命名属性(如果id值已不包含在该项目中)。如果您确实使用jsonmap解决方案,则应谨慎更改列的顺序(使用remapColumns)以及稍后重新加载数据。更改列顺序后,您可能需要更新jsonmap值。因此,我再说一遍,我建议您更改从服务器返回的数据格式。

更新:您问题的已更新部分制定了与绝对新问题。这是纯粹的C#问题。不过我试着回答,因为我也使用C#。

您只需对代码进行微小更改即可执行以下操作:首先应添加using System.Dynamic;using System.Linq;。然后,您应该将using (...) {...}内的代码替换为以下

var rowList = new List<dynamic>();
while (dataReader.Read()) {
    var row = new ExpandoObject() as IDictionary<string, object>;
    for (int j = 0; j < dataReader.FieldCount; j++) {
        if (!dataReader.IsDBNull(j)) {
            row.Add(dataReader.GetName(j), dataReader.GetValue(j));
        }
    }
    rowList.Add(row);
}

序列化rowList将生成名称属性。如果您知道数据的主键,则可以使用相同的方式(使用id)添加具有相应值的row.Add("id", IdHelper.EncodeId(pkv))属性。我没有包含该部分,因为您发布的代码未满,pkv目前始终为new List<object>(),这是错误的。如果数据具有组合键(多个值集是唯一的),那么您可以使用'_'(下划线)作为分隔符来对键进行字符串连接。