元數據這一詞對於計算機科學來講不算陌生,對元數據的解釋最簡單的解釋就是描述數據的數據,那麼Model元數據固然是描述Model中各類成員的數據了,在ASP.NET MVC中ModelMetadata這個類專門用於描述Model及其成員的信息,這樣就代表Model的描述須要一個ModelMetadata,Model裏面的各個屬性也須要ModelMetadata;換言之,ModelMetadata這個類有個自引用的現象,類的內部有個集合存儲ModelMetadata。其聲明以下html
IEnumerable<ModelMetadata> Properties
這是ModelMetadata的一個成員,它的成員有不少,按如今的認識就分了兩類,一種是包含上述屬性的用於描述數據基本信息用的屬性;一種是用於定製的屬性,那部分包含定製信息的屬性主要是用於呈如今View中或控制屬性顯示的模板。框架
那麼用於描述數據基本信息用的屬性就有ide
類型post |
屬性名學習 |
描述ui |
Iemumerable<ModelMetadata>google |
Propertiesurl |
屬性成員的元數據集合spa |
Typecode |
ModelType |
自己的類型 |
bool |
IsComplexType |
是否複雜類型 |
bool |
IsNullableValueType |
是否可空值 |
Type |
ContainerType |
父級類型 |
object |
Model |
本類的實例 |
string |
PropertyName |
在父類型中的屬性名稱 |
Dictionary<string,object> |
AdditionalValue |
存儲自定義屬性的字典集 |
ModelMetadataProvider |
Provider |
元數據的提供者 |
在這個表中複雜類型這個詞要稍做解釋,其實也不算難,就是一個類型的值能經過字符串轉換過來的就算是簡單類型,反之則是複雜類型,例如整形(」1」),浮點型(」1.23」),日期(」2014-07-29」)等類型能經過字符串轉換獲得相應的(int,float,DateTime)類型的值,那麼這個類型就算是簡單類型,不然是複雜類型。
另外一部分用做定製的屬性以下所示
類型 | 屬性名 | 定製的Attribute | 描述 | 備註 | |
string | TemplateHint | HiddenInputAttribute | UIHintAttribute | 指定動態數據用來顯示數據字段的模板或用戶控件。 | 兩個Attribute同時使用,後者具備更高的優先級 |
bool | HideSurrounding | 該特性用於指示是否應將屬性值或字段值呈現爲隱藏的 input 元素 | |||
bool | ShowForDisplay | ScaffoldColumnAttribute | 控制目標元素是否應該存在於基架之中 | ||
bool | ShowForEdit | ||||
string | DataTypeName | DataTypeAttribute | 指定要與數據字段關聯的附加類型的名稱。 | ||
bool | ConvertEmptyStringToNull | DisplayFormatAttribute | 指定 ASP.NET 動態數據如何顯示數據字段以及如何設置數據字段的格式。 | ||
string | NullDisplayText | ||||
string | DisplayFormatString | ||||
string | EditFormatString | ||||
bool | IsReadOnly | EditableAttribute | ReadOnlyAttribute | EditableAttribute:指示數據字段是否可編輯; ReadOnlyAttribute:指定該特性所綁定到的屬性是隻讀屬性仍是讀/寫屬性。 |
兩個Attribute同時使用,前者具備更高的優先級 |
string | DisplayName | DisplayAttribute | DisplayNameAttribute | 用於設置目標元素的顯示名稱 | 二者共同使用時,前者具備更高優先級 |
string | ShowDisplayName | 能夠爲實體分部類的類型和成員指定可本地化的字符串 | |||
string | Description | ||||
int | Order | ||||
string | watermark | ||||
bool | IsRequired | RequiredAttribute | 目標元素設置爲是否必需的數據成員 |
Model模板則是利用Model元數據的定製信息來給HtmlHelper<TModel>的模板方法以特定的形式把數據以及元數據生成Html展現出來。那麼這裏的模板有框架裏面預約義的模板,也能夠由開發人員本身去定義的模板。下面則介紹預約義的模板。
預約義模板主要使用的是UIHintAttribute來設置,如前面介紹元數據定製中所描述的:用於指定動態數據用來顯示數據字段的模板或用戶控件。下面仍是以表格的形式展示各個預約義模板的使用還有結果。
模板名稱 | 使用形式 | 結果 |
EmailAddress | [UIHint("EmailAddress")]或者 [DataType(DataType.EmailAddress)] |
DisplayFor:<a href="mailto:foo@gmail.com">goo@gmail.com</a> |
HiddenInput | [UIHint("HiddenInput")] | DisplayFor:1234567 |
EditFor:<input id="Foo" name="Foo" type="hidden" value="1234567"/> | ||
Html | [UIHint("Html")]或者 [DataType(DataType.Html)] |
DisplayFor:<a href="www.google.com">google.com</a> |
Text | [UIHint("Text")]或者 [DataType(DataType.Text)] |
DisplayFor:Admin |
String | [UIHint("String")] | EditFor:<input class="text-box single-line" id="Foo" name="Foo" type="text" value="Admin"/> |
Url | [UIHint("Url")]或者 [DataType(DataType.Url)] |
DisplayFor:<a href="http://www.google.com">http://www.google.com</a> |
MultilineText | [UIHint("MultilineText")]或者 [DataType(DataType.MultilineText)] |
EditFor:<textarea class="text-box multi-line" id="Foo" name="Foo">Admin</textarea> |
Password | [UIHint("Password")]或者 [DataType(DataType.Password)] |
EditFor:<input class="text-box single-line password" id="Foo" name="Foo" type="password" value=""/> |
Decimal | [UIHint("Decimal")] | Display:123.00 |
EditFor:<input class="text-box single-line" id="Foo" name="Foo" type="text" value="123.00\"/> | ||
Boolean | [UIHint("Boolean")] | Dislplay:<input id="Foo" name="Foo" type="checkbox" value="true" disable="true"/> |
EditFor:<input id="Foo" name="Foo" type="checkbox" value="true" disable="true"/> <input name="Foo" type="hidden" value="false"/> |
||
Collection | [UIHint("Collection")] | Display:各元素的Display形式 |
EditFor:各元素的Edit形式 | ||
Object | [DisplayName("城市")] | DisplayForModel:<div class="display-label">城市</div> <div class="display-field">佛山市</div> |
此時在一個以UserInfo類型爲強類型的視圖中調用@Html.DisplayForModel(),類的信息則會顯示出來。可是如果UserInfo中的屬性必定要是簡單類型的;
若是要給類中的某個成員定製模板,如給DateTime類型再定義一個MyDateTime模板
@model DateTime 時間是 @Model.ToString("yyyy-MM-dd HH:mm:ss")
而後給相應的成員使用上標記
[DataType(「MyDateTime」)]
則可。
目前這部份內容還沒學習完,通過後續的學習後會繼續補充此文,因爲還在學習,故會有理解得不恰當的地方,以上有什麼說的不對的請指正,有什麼好的建議或意見也請分享,謝謝!