iT邦幫忙

DAY 16
0

Kuick Hands on Labs系列 第 16

Kuick Hands on Labs -- 16. 優化列表資料

  • 分享至 

  • xImage
  •  

有些資料欄位是提供給系統使用,或是參照其他資料表的 PK 值或是 Enum 型態,不適合直接陳列給使用者看,最好是經過優化成易讀性高的資料。
列表資料優化 3 步驟:
1. 首先顯示所有欄位與原始資料
2. 隱藏「加密欄位」與「系統欄位」
3. 重組適合的欄位值
在進行列表資料優化之前,先調整「員工」Entity與「職稱」列舉,如下:

EmployeeEntity 欄位程式定義

[DataMember]
[Description("帳號")]
[ColumnSpec(SpecFlag.PrimaryKey)]
public string EmployeeID { get; set; }
 
[DataMember]
[Description("密碼")]
[ColumnSpec(SpecFlag.NotAllowNull, 500)]
[ColumnEncrypt(Encryption.Asymmetry)]
public string Password { get; set; }
 
[DataMember]
[Description("全名")]
[ColumnSpec(SpecFlag.NotAllowNull, 50)]
public string FullName { get; set; }
 
[DataMember]
[Description("部門")]
[ColumnSpec(50)]
[ColumnRefer(typeof(DepartmentEntity))]
public string DepartmentID { get; set; }
 
[DataMember]
[Description("職務")]
[ColumnSpec]
public JobTitle Job { get; set; }
 
[DataMember]
[Description("電郵")]
[ColumnSpec(200)]
public string Email { get; set; }
 
[DataMember]
[Description("等級")]
[ColumnSpec]
[ColumnInitiate(8)]
public int Level { get; set; }
 
[DataMember]
[Description("生日")]
[ColumnSpec]
[ColumnVisual(VisualInput.Date)]
public DateTime Birthday { get; set; }
 
[DataMember]
[Description("兼職")]
[ColumnSpec]
public bool PartTime { get; set; }

職稱 (JobTitle) 列舉程式定義

public enum JobTitle
{
	[Description("首席執行官")]
	CEO,
 
	[Description("經理")]
	Manager,
 
	[Description("業務")]
	Salesman,
 
	[Description("工程師")]
	Engineer,
 
	[Description("專案管理師")]
	PM
}

列表資料優化 3 步驟:
1. 首先顯示所有欄位與原始資料

2. 隱藏「加密欄位」與「系統用欄位」
實作成 SkipField 方法,傳入 Column 物件,回傳是否略過。

// 隱藏欄位判斷
private bool SkipField(Column column)
{
	// 加密欄位
	if(null != column.Encryption) { return true; }

	// 系統內建欄位
	if(column.Visual.SystemColumn) { return true; }
	
	// 其他欄位皆顯示
	return false;
}


3. 調整欄位值
以 EmployeeEntity 為例,至少有以下幾個欄位值需要調整:
「部門」:以 PK 參照其他 Entity 的資料
「職稱」:列舉的 DescriptionAttribute 定義值
「生日」:只需顯示年月日的 DateTime 欄位值
「兼職」:使用圖示代表布林值
實作成 DisplayFieldValue 方法,傳入 Entity 與 Column 物件,回傳重組過的 HTML 值。

// 重組欄位值
private string DisplayFieldValue(IEntity instance, Column column)
{
	// null 欄位直接回傳空定串
	bool isNull = instance.IsNullCheck(column.Spec.ColumnName);
	if(isNull) { return string.Empty; }
 
	// 取值
	object value = instance.GetValue(column);
 
	if(
		null != column.Refer.Type
		&&
		column.Spec.DbType != SqlDataType.Enum
		&&
		column.Spec.DbType != SqlDataType.Bit) {
		// 以 PK 參照其他 Entity
 
		// 從 Entity 快取取出參照定義
		IEntity[] refSchemas = EntityCache.Get(column.Refer.Type);
		if(refSchemas.IsNullOrEmpty()) {
			return string.Empty;
		} else {
			IEntity one = Entity.Get(
				refSchemas[0].EntityName, 
				value.ToString()
			);
			if(null == one) {
				return value.ToString();
			} else {
				// 回傳參照資料 TitleValue 屬性
				return one.TitleValue;
			}
		}
 
	} else if(column.IsBoolean) {
		// 布林值:使用圖型顯示
		bool b = (bool)value;
		return b 
			? "<span class=\"glyphicon glyphicon-ok\"></span>" 
			: string.Empty;
 
	} else if(column.IsNumber) {
		// 數值
		return value.ToString();
 
	} else if(column.IsDateTime) {
		// 日期
		DateTime d = (DateTime)value;
		if(column.Visual.Input == VisualInput.Date) {
			// 只顯示年月日 (yyyy-MM-dd)
			return d.yyyyMMdd();
		} else {
			// 顯示時戳 (yyyy-MM-dd hh:mm:ss)
			return d.yyyyMMddHHmmss();
		}
 
	} else if(column.IsEnum) {
		// 列舉
 
		// 從列舉快取取出定義
		EnumReference ef = EnumCache.Get(column.Property.PropertyType);
		if(null == ef) { return string.Empty; }
 
		// 查詢目前列舉項目資訊
		EnumItem ei = ef.Get(value.ToString());
		if(null == ei) { return string.Empty; }
 
		// 顯示該列舉項目 DescriptionAttribute 定義值
		return ei.Title;
 
	} else {
		// 一般
		return value.ToString();
	}
}

下一篇說明列表主程式與分頁程式實作。


上一篇
Kuick Hands on Labs -- 15. 資料列表基本條件
下一篇
Kuick Hands on Labs -- 17. 列表與分頁
系列文
Kuick Hands on Labs30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言