使用jqGrid colModel的'jsonmap'属性和无类型的JSON

时间:2011-06-15 21:14:07

标签: javascript asp.net wcf json jqgrid

我启用了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>();
    }
}  

因此,结果中的每一行数据都是无类型的 - 一行基本上只是一个没有附加任何列名的List。

我认为这使得我无法使用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”属性将该列映射到underyling DataTable中的列。 DataTable中列的顺序可能不同:

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

但无论我如何查询我的数据库,网格仍将显示第一列为ID的位置,第二列为Name,第三列为Birthdate。我不必更改我的SQL查询以更改网格中列的顺序。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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