有學過ASP.Net MVC的人都知道在開始撰寫一套網站系統時,可以從三個方面下手,Code First, DB First與Model First,Model First可以直接使用ADO.Net東拉拉西拉拉來產生Model Class,而MVC可以讓你在Property上加上一些Attribute,像DisplayName, Required...等,減少開發人員在寫Model前端顯示的一些程式。但當我們從ADO.Net的Model Diagram中調整Model時,需要對Model Class進行更新,一旦更新,之前加的那些Attribute都會被吃光光,所以為了不讓抓狂的情況發生,就可以使用Model Metadata來保留之前設定的Attribute。
通常限量在 Create 每個 Model 的 Metadata 時都習慣在 Model 的 MVC 資料夾內建立一個名稱為 Metadata 的資料夾,然後把每個Model的Metadata放置在此。
(注意:當你在某個資料夾路徑內建立一個 Class 時,Visual Studio 會自動在 Namespace 後面加上資料夾名稱,有多少層 Namespace 就加多少,所以要注意Namespace要和 Model 的一樣。另外,因為 Metadata 是描述該物件的 data,所以習慣把 Metadata 的 Class 作為Model的Inner Class,然後記得要在 Model Class Define 的上面加上 MetadataType 的Attribute。)
執行結果:
使用ADO.Net建Model Class(2) |
Metadata翻譯就是描述Data的Data,譬如說一個"人"有多少錢是我這個系統所需要的資料,而這個人身高體重年齡,對系統來說不是必要,但這些資訊是可以描述這個人,與其他人做區別,這就是Metadat。要實作Meatadata很簡單,只要透過MetadataType Attribute就OK了。MetadataType Attribute 是從 MVC 2.0 開始加入的新功能,可以搭配使用partial class將Model的Meatadata與Property獨立分開,程式碼如下:
Message.cs
using System; namespace ModelMetadataTest.Models { public partial class Message { public string Id { get; set; } public string Title { get; set; } public string Content { get; set; } public DateTime PostTime { get; set; } public string Poster { get; set; } } }
MessageMD.cs
using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace ModelMetadataTest.Models { [MetadataType( typeof( MessageMD ) )] public partial class Message { public class MessageMD { public string Id { get; set; } [DisplayName( "標題" )] public string Title { get; set; } [DisplayName( "內容" )] public string Content { get; set; } [DisplayName( "留言日期" )] public DateTime PostTime { get; set; } [DisplayName( "留言者" )] public string Poster { get; set; } } } }
通常限量在 Create 每個 Model 的 Metadata 時都習慣在 Model 的 MVC 資料夾內建立一個名稱為 Metadata 的資料夾,然後把每個Model的Metadata放置在此。
(注意:當你在某個資料夾路徑內建立一個 Class 時,Visual Studio 會自動在 Namespace 後面加上資料夾名稱,有多少層 Namespace 就加多少,所以要注意Namespace要和 Model 的一樣。另外,因為 Metadata 是描述該物件的 data,所以習慣把 Metadata 的 Class 作為Model的Inner Class,然後記得要在 Model Class Define 的上面加上 MetadataType 的Attribute。)
執行結果:
當然 MetadataType 的用法應該沒那麼簡單,這種用法只是冰山一角,但對開發人員來說可是減少大大的Cost。
留言
張貼留言