学习MINIUI框架有几天了,今天算是弄明白数据传递的原理了。
要提到的两个东西是HashTable和ArrayList
HashTable 是键值对的形式,通过键来访问值。
ArrayList集合 可以说是个对象数组,像数组一样通过索引来访问值。
下面通过这段代码,做测试,来了解其原理
public static Hashtable SearchUser(string key, int index, int size, string sortField, string sortOrder)
{//查询语句
string sql = string.Format(@"SELECT *,(DaySalary*WorkTime) allMoney FROM TraineeInfo WHERE (UserName LIKE '%{0}%' or IdentityCardNumber like '%{0}%')", key);
//排序字段
if (String.IsNullOrEmpty(sortField) == false)
{
if (sortOrder != "desc") sortOrder = "asc";
sql += " order by " + sortField + " " + sortOrder;
}
else
{
sql += " order by ID desc ";
}
//调用查询
DataTable dt = DBHelper.ExecuteDatatable(sql);
//所有结果存入集合 调用dt转集合方法
ArrayList dataall = DataTable2ArrayList(dt);
//分页
ArrayList data = new ArrayList();
int start = index * size, end = start + size;
for (int i = 0, l = dataall.Count; i < l; i++)
{
Hashtable record = (Hashtable)dataall[i];
if (record == null) continue;
if (start <= i && i < end)
{
data.Add(record);
}
}
Hashtable result = new Hashtable();
result["data"] = data;
result["total"] = dataall.Count;
return result;//此处将返回一个哈希表,第一个键值为数据,第二个问统计信息
//转化为json
}
/// <summary>
/// DT转化成集合
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static ArrayList DataTable2ArrayList(DataTable data)
{
ArrayList array = new ArrayList();
for (int i = 0; i < data.Rows.Count; i++)
{
DataRow row = data.Rows[i];
Hashtable record = new Hashtable();
for (int j = 0; j < data.Columns.Count; j++)
{
object cellValue = row[j];
if (cellValue.GetType() == typeof(DBNull))
{
cellValue = null;
}
record[data.Columns[j].ColumnName] = cellValue;
}
array.Add(record);
}
return array;
}
在以上代码中,第16行dt的形式为:
这个就是普通的不能再普通,我们熟悉的不能再熟悉的数据表形式了,就不再解释了。
在18行 转化为ArrayList后形式为:
这是通过官方demo的一个方法转化的,可以看出,它是把一行作为一个对象写进了ArrayList,其中的每一行又都包含了列名和此行对应的值,看看 对于一行中的每个列名和值的组合 不就是哈希表的形式吗? 接着继续往下分析
在35行 将数据打包写入哈希表的第一个键值,统计信息放第二个键值后结果为:
其实就是用哈希表对上一步的ArrayList集合又包裹了一层,取键名为data,并且又添加了一个键值对,包含的是统计信息。为什么这么做呢?为了json呀!
看看对于这个哈希表,用JSON编码后的情况
执行操作
string json JSON.Encode(result);
结果:
{
"data": [
{
"DaySalary": 80,
"Note": null,
"UserName": "李22",
"PhoneNumber": "120",
"Sex": "0",
"allMoney": 640,
"HomeAddress": null,
"ID": "YG0002",
"Type": 0,
"WorkTime": 8,
"IdentityCardNumber": "123456789012345677"
},
{
"DaySalary": 100,
"Note": null,
"UserName": "张111",
"PhoneNumber": "110",
"Sex": "1",
"allMoney": 0,
"HomeAddress": null,
"ID": "YG0001",
"Type": 1,
"WorkTime": 0,
"IdentityCardNumber": "123456789012345678"
}
],
"total": 2
}
实际情况就是,这个json由两个部分构成:
第一个是data,值为一个数组,由两个对象构成,分别代表两条数据
第二个直接是一个简单的键值对
对于MINIUI来说,给前台一个这样一个json,它就会把数据为我们加载出来,其中加入的total是记录总数,用于分页,不分页则可以去掉。
源码