2011-06-15 35 views
1

我的支持AJAX的WCF服务使用合同返回JSON,使用jqGrid的colModel的“jsonmap”属性与非类型化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中。

编号喜欢能够将我的基础数据表的列映射到我的jqGrid的列,但无需强烈键入我的数据约定。这可能吗?我认为它可能是使用匿名类型,其中匿名对象(每个匿名对象是一行)的列表具有与底层DataTable中的每列相对应的属性,但我无法做到这一点。

谢谢。

EDIT

下面是要我想要实现(使用服务器端代码,而不是JavaScript的)的例子。

下面基本上是一列模型所jqGrid的在C#中,多数民众赞成做:

  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" 
       }     
      }; 

的每一列的“数据字段”属性,列映射到在underyling数据表中的列。列的DataTable中的顺序可能会有所不同:

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

但不管我怎么查询我的数据库,网格仍然会显示,其中第一列是ID,第二列是名称,而第三列是出生日期。我不必改变我的SQL查询,以改变我的网格中的列的顺序。

我基本上想在我的客户端colModel的jqGrid的DataField属性的等价物。这将需要我的JSON列被命名,或者我至少可以将jqGrid列映射到JSON数据源中列的数字索引。

回答

1

您使用的JQGridContract类将以可由标准jsonReader(详情请参阅here)读取的格式获取数据。结果中的每一行数据都不是“无类型的”。它具有“字符串”类型。没有必要使用jsonmap该行中字符串的位置定义了该字符串属于哪个网格列。因此,对于数据映射,应使用cell列表中的位置。

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

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

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

+0

有没有反正,例如,说每个JSON行的第一个位置(第一列)应该放在实际jqGrid的最后一列?所以我可以在演示文稿中移动每列的位置,而不管它如何在发送给客户端的JSON中进行排列?我认为这是jsonmap做的,但我不确定。 – 2011-06-15 21:38:13

+0

我刚刚在另一篇文章中提到你提到'remapColumns'函数,也许我会试试。 – 2011-06-15 21:47:28

+0

@ Sean Thoman:你认为哪里可以提供关于客户端列映射的信息?我无法想象一个为什么可能需要它的例子。大概你描述一个你有的例子?在标准情况下,jqGrid调用一个服务器方法,例如'GetProducts'。网格列定义和'GetProducts'在'cell'列表中具有相同的列顺序。所以不需要映射。可能你有一些像[这里]描述的情况(http://stackoverflow.com/questions/5383847/is-it-possible-to-modify-the-colmodel-after-data-has-loaded-with-jqgrid/5408195 #5408195)? – Oleg 2011-06-15 21:47:44

相关问题