有些資料欄位是提供給系統使用,或是參照其他資料表的 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();
}
}
下一篇說明列表主程式與分頁程式實作。