程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC Model元數據及其定制: 初識Model元數據

ASP.NET MVC Model元數據及其定制: 初識Model元數據

編輯:關於ASP.NET

Contronoller激活之後,ASP.NET MVC會根據當前請求上下文得到目標Action的名稱,然後解析出對應的方法並執行之。在整個Action方法的執行過程中,Model元數據的解析是一個非常重要的環節。ASP.NET MVC中的Model實際上View Model,表示最終綁定到View上的數據,而Model元數據描述了Model的數據結構,以及Model的每個數據成員的一些特性。正是有了Model元數據的存在,才使模板化HTML的呈現機制成為可能。此外,Model元數據支撐了ASP.NET MVC的Model驗證體系,因為針對Model的驗證規則正是定義在Model元數據中。ASP.NET MVC的Model元數據通過類型ModelMetadata表示。ModelMetadata通過一系列的屬性描述了Model及其成員相關的元數據信息,在正式介紹這些元數據選項之前,我們很有必要先來了解一下Model元數據層次化結構。

一、Model元數據層次化結構

作為Model的數據類型可以一個和簡單的字符串或者是一個值類型的對象,也可能是一個復雜的數據類型。對於一個復雜的數據類型,基於類型本身和數據成員的元數據都通過一個ModelMetadata來表示,而某個數據成員又可能是一個復雜類型,所以通過ModelMetadata對象表示的Model元數據實際上具有一個樹形層次化結構。

舉個例子,我們具有一個具有如下定義的表示聯系人的數據類型Contact。屬性Name、PhoneNo、EmailAddress和Address分別代表姓名、電話號碼、郵箱地址和聯系地址。聯系地址通過另一個數據類型Address表示,屬性Province、City、District和Street分別表示所在省份、城市、城區和街道。

   1: public class Contact
2: {
3: public string Name { get; set; }
4: public string PhoneNo { get; set; }
5: public string EmailAddress { get; set; }
6: public Address Address { get; set; }
7: }
8: public class Address
9: {
10: public string Province { get; set; }
11: public string City { get; set; }
12: public string District { get; set; }
13: public string Street { get; set; }
14: }

如果將Contact類型作為Model,作為其元數據的ModelMetadata不僅僅具有Contact類型本身和其屬性成員的描述,由於其Address屬性是一個復雜類型,元數據還需要描述定義在該類型中的4個屬性成員。下圖反映基於Contact類型的Model元數據的層次化結構。

表示Model元數據的ModelMetadata類型不僅用於描述某個作為Model的數據類型,還用於遞歸地描述其所有屬性成員(不包含字段成員),所以ModelMetadata具有一個樹型層次化結構,這也可以從ModelMetadata的定義可以看出來。

   1: public class ModelMetadata
2: {
3: //其他成員
4: public virtual IEnumerable<ModelMetadata> Properties { get; }
5: }

如上面的代碼片斷所示,ModelMetadata具有一個類型為IEnumerable<ModelMetadata>的只讀屬性Properties,表示用於描述屬性/字段成員的ModelMetadata集合。ModelMetadata的層次化結構可以通過如下圖所示的UML來體現。由於基於類型的ModelMetadata和基於數據成員的ModelMetadata是一種包含關系,我們可以將前者稱為後者的容器(Container)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved