ASP.NET MVC - Model Metadata

有學過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。



使用ADO.Net建Model Class(1)

使用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。




留言