我启用了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数据源中列的数字索引。
答案 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数据的最佳方法。更有效地使用SqlCommand
和SqlDataReader。