【问题标题】:Using the 'jsonmap' property of jqGrid colModel with untyped JSON将 jqGrid colModel 的 'jsonmap' 属性与非类型化 JSON 一起使用
【发布时间】:2011-06-15 21:14:06
【问题描述】:

我的启用 AJAX 的 WCF 服务使用此合同返回 JSON,

[DataContract]
public class JQGridContract
{
    [DataContract]
    public class Row
    {
        [DataMember]
        public int id { get; set; }

        [DataMember]
        public List<string> cell { get; set; }

        public Row()
        {
            cell = new List<string>();
        }
    }

    [DataMember]
    public int page { get; set; }

    [DataMember]
    public int total { get; set; }

    [DataMember]
    public int records { get; set; }

    [DataMember]
    public List<Row> rows { get; set; }

    public JQGridContract()
    {
        rows = new List<Row>();
    }
}  

所以结果中的每一行数据都是无类型的——一行本质上只是一个没有附加任何列名的列表。

我认为这让我无法使用 colModel 的 'jsonmap' 属性?基本上我正在从数据库中检索一个 DataTable,然后将该 DataTable 放入这个 JQGridContract 表单中。但是,来自 DataTable 的列信息不包含在传递给客户端的 json 中。

我希望能够将我的底层 DataTable 的一列映射到我的 jqGrid 的一列,但不需要强输入我的数据协定。这可能吗?我认为它可能使用匿名类型,其中匿名对象列表(每个匿名对象是一行)具有与底层 DataTable 中的每一列相对应的属性,但我无法做到这一点。

谢谢。

编辑

这是我想要实现的示例(使用服务器端代码,而不是 javascript)。

下面本质上是在 c# 中完成的 jqGrid 的列模型:

            return new JQGridColumnCollection()
            {
                new JQGridColumn()
                {
                    DataField = "ID",     // maps to the DataTable
                    DataType = typeof(int),
                    HeaderText = "ID",
                    PrimaryKey = true,
                },
                new JQGridColumn()
                {
                    DataField = "Name",  
                    DataType = typeof(string),
                    HeaderText = "Name"
                },
                new JQGridColumn()
                {
                    DataField = "Birthdate",  
                    DataType = typeof(DateTime),
                    HeaderText = "Birth Date" 
                }                
            };

每列的“DataField”属性将该列映射到底层数据表中的一列。 DataTable 中列的顺序可能不同:

DataTable table = GetDataTable(" SELECT [Birthdate], [ID], [Name] From PersonTable "); 

但是无论我如何查询我的数据库,网格仍然会显示第一列是 ID,第二列是名称,第三列是出生日期。我不必更改我的 SQL 查询来更改网格中列的顺序。

我本质上希望在 jqGrid 的客户端 colModel 中具有等效的 DataField 属性。这将要求我的 JSON 列被命名,或者我至少可以将 jqGrid 列映射到 JSON 数据源中列的数字索引。

【问题讨论】:

    标签: javascript asp.net wcf json jqgrid


    【解决方案1】:

    您使用的JQGridContract 类将获取标准jsonReader 可以读取的格式的数据(详见here)。结果中的每一行数据都不是“无类型”的。它的类型为“字符串”。无需使用jsonmap字符串在行中的位置 定义了字符串属于网格的哪一列。因此,对于数据映射,应使用cell 列表中的位置。

    如果您使用JQGridContract 类,则不需要任何强类型数据转换。您可以轻松地将任何数据类型转换为字符串,从而将数据库表的数据转换为JQGridContract 实例。如果您确实会遇到问题,您应该将您的问题附加到您使用的 jqGrid 的 colModel 定义中。

    已更新:在 SELECT 中使用字段的顺序无关紧要。重要的是您将数据从table 变量放置到JQGridContract 的实例中的顺序。您有一个方法,例如 GetUserBirthday,它返回 JQGridContract。该方法应首先将转换为字符串的ID 放入cell 列表中,然后将Name 放入转换为ISO 日期格式(yyy-mm-dd) 的Birthdate。如果你想使用你定义的JQGridContract,你应该这样做。

    顺便说一句,DataTable 并不是获取每个 SELECT 数据的最佳方式。更有效地使用SqlCommandSqlDataReader

    【讨论】:

    • 不管怎样,比如说每个JSON行的第一个位置(第一列)应该放在实际jqGrid的最后一列?所以我可以在演示文稿中移动每一列的位置,而不管它在发送到客户端的 JSON 中是如何排列的?我以为这就是 jsonmap 所做的,但我不确定。
    • 我刚刚注意到您在另一篇文章中提到了“remapColumns”功能,也许我会尝试一下。
    • @Sean Thoman:您认为在哪里为客户提供有关列映射的信息?我无法想象为什么需要它的例子。可能你描述了一个你有的例子?在标准情况下,jqGrid 调用一个服务器方法,例如,GetProducts。网格列定义和GetProductscell 列表中具有相同的列顺序。所以不需要映射。可能您有类似here 描述的情况?
    • 我只希望 jqGrid 中列的顺序独立于 JSON 中列的顺序。这意味着我可以更改 jqGrid 的外观(重新排列列),而不必篡改我的数据访问层(我的 sql 查询和/或 wcf 服务)。如果可能的话,我不希望来自 WCF 服务的列的排列决定网格中列的排列。
    • @Sean:对不起,但这不是一个例子。如果有误解,应该举一个例子来说明一切。目前,我认为您写的内容没有任何意义。客户端部分(jqGrid)的调用服务器应该使用双方使用的一个合约。如果我们使用相同的字母,但我会写德语单词,而您将把单词读成英语单词,您将一无所知。如果服务器以一种固定顺序发送数据,客户端必须知道列顺序并使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多