How to Get DisplayName in Metadata (LINQ)
今天在寫匯出EXCEL功能的時候(這個功能真的是使用者人人愛耶…,工程師寫法還百百款),找到一篇是LINQ的IQueryable物件的寫法(其實跟datatable沒什麼二樣),不過比較重點的是,他是利用IQueryable取回MetaType之後,再去找所有的欄位名稱。因為之前沒有這樣用過,特別記一下。
一般宣告Metadata的方式:
public partial class Product {
}
class Product_Metadata {
[DisplayName("The Units In Stock")]
public object UnitsInStock { get; set; }
}
然後我們就可以利用DataContext的MetaModel來找到我們要的欄位資料:取回 MetaType(_rows.ElementType= typeof(TableEntity))之後,在PersistentDataMembers裡面可以找到所有的欄位名稱。
不過麻煩的是,我並不是所有的欄位都要匯出(ex:系統編號),所以我又開始東翻西找…
foreach (PropertyDescriptor p in properties)
{
if (p.DisplayName != "*")
_titleDisplayName.Add(p.Name, p.DisplayName);
}
利用AssociatedMetadataTypeTypeDescriptionProvider可以取回該TableEntity的Metadata的資料,然後利用GetProperties就可以拿到DisplayName囉。
(不過其實有另外一個屬性ScaffoldColumn來調整欄位是否顯示,可是我還沒研究要怎麼用上去T_T,所以我就偷懶的把DisplayName設為"*"表示不顯示的欄位。)
相關連結:
Dynamic Data and Custom Metadata Providers
ASP.NET MVC Tip #2 - Create a custom Action Result that returns Microsoft Excel Documents
HOW TO:自訂資料模型中非內建資料型別的資料欄位外觀和行為
Using an Associated Metadata Class outside Dynamic Data
Dynamic Data and the Associated Metadata Class