中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET MVC Model元數據(三)

發布時間:2020-05-27 05:43:45 來源:網絡 閱讀:874 作者:jinyuan0829 欄目:編程語言

 

ASP.NET MVC Model元數據(三)

前言

在上篇中我們大概的講解了Model元數據的生成過程,并沒有對Model元數據本身和詳細的生成過程有所描述,本篇將會對詳細的生成過程進行講解,并且會對Model元數據本身的結構稍作講解,讀完本篇過后你將會對Model元數據的結構有個很清晰的印象。

 

Model元數據

  • 什么是Model元數據?

  • 生成Model元數據的過程【一】

  • 生成Model元數據的過程【二】

  • ModelMetaData的定義、詳解

  • Model元數據應用(常用特性應用)-1

  • Model元數據應用(自定義視圖模板)-2

  • Model元數據應用(IMetadataAware接口使用)-3

 

生成Model元數據的過程【二】

還記得Model元數據系列篇的第一章里的最后一幅圖嗎?

圖1

ASP.NET MVC Model元數據(三)

 

沒有錯,MVC框架根據我們定義的視圖模型生成了一個Model元數據ModelMetadata(實際為DataAnnotationsModelMetadata類型是繼承自ModelMetadata類型的,在下文中為了更直觀的方便講解所以還是用ModelMetadata類型來作介紹)。我們來看一下ModelMetadata類型的定義:

代碼1-1

public class ModelMetadata
    {
        
        
        public ModelMetadata(ModelMetadataProvider provider, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName);
        //
        // 摘要:
        //     獲取模型元數據對象的集合,這些對象描述模型的屬性。
        //
        // 返回結果:
        //     用于描述模型屬性的模型元數據對象的集合。
        public virtual IEnumerable<ModelMetadata> Properties { get; }
//
        // 摘要:
        //     獲取模型的類型。
        //
        // 返回結果:
        //     模型的類型。
        public Type ModelType { get; }
        protected ModelMetadataProvider Provider { get; set; }
        ……
    }

只留了個構造函數和三個屬性,詳細的部分下篇會講到,構造函數中的第一個參數類型大家肯定很熟悉,那就是上篇中講到的Model元數據生成程序,用來生成Model元數據(ModelMetadata類型)的,這樣的是把ModelMetadataProvider類型的引用設置到Model元數據的內部,也就是Provider屬性,這樣做是有目的的隨后就會講到,在其定義中還有個Properties屬性,類型大家都看到了是ModelMetadata類型的集合,這就是ModelMetadata類型關鍵的所在了,Properties屬性表示著當前ModelMetadata的所描述類型中的屬性元數據集合。

圖2

ASP.NET MVC Model元數據(三)

用前篇介紹過的Customer類型來做描述,對應著Customer類型的結構MVC框架也會生成對應的ModelMetadata類型結構,這里捎帶提一下,對于Address屬性類型是Address類型這種屬于復雜類型,MVC框架會向下繼續生成就如同生成Customer類型一樣。

那么這樣的結構是怎么生成的呢?當然不用說了,是依靠Provider屬性也就是ModelMetadataProvider類型的引用來生成結構的,如圖3所示:

圖3

ASP.NET MVC Model元數據(三)

首先根據當前Model元數據ModelMetadata類型(對應的對象是Customer類型)中的Model屬性和ModelType屬性來作為參數調用AssociatedMetadataProvider類型的GetMetadataForProperties()方法,這里說一下ModelMetadata類型的Model屬性,表示著當前Model元數據所對應對象的值,也是用這個值來判斷是否是復雜類型的,ModelType屬性上面說過。

在GetMetadataForProperties()方法中會先根據自定義類型描述類型的GetProperties()方法來獲取當前對象是Customer類型的所有的屬性,并且封裝成屬性描述類型集合。

隨后根據獲取到的屬性描述類型集合,遍歷此集合并且根據遍歷中的單個屬性描述類型調用AssociatedMetadataProvider類型中的GetMetadataForProperty()方法,這里要說的是第一個參數modelAccessor默認是Null的,第二個參數containerType是表示著當前Customer類型,第三個參數就是屬性描述類型了里面包含著屬性類型的所有信息。有的朋友會問說明這些屬性做什么,因為等下會說到第二個參數containerType的。

在AssociatedMetadataProvider類型中的GetMetadataForProperty()方法中,會根據PropertyDescriptor類型的參數獲取到當前屬性上所有描述信息(也就是那些特性類),比如當前的PropertyDescriptor類型是結構化Customer類型中的CustomerID,那圖3中AttrbuteList類型中就是包含著所有依附在這個屬性上的特性類。后續的生成過程還是跟上篇的講解的一樣依舊的調用了AssociatedMetadataProvider類型的CreateMetadata(),只不過在AssociatedMetadataProvider類型中方法是抽象中,實際是由它的實現類DataAnnotationsModelMetadataProvider中的CreateMetadata()方法來完成的。

這里大家可能會發現,在圖3中***框中的操作都是屬于遍歷中的操作,就是每次都會只會生成一個ModelMetadata類型實例然后最后合并在一起返回出去。

還有要說的就是在圖3中***框中的每個調用的函數都有個Type類型的containerType參數,這就是上面說過的Customer類型,并且在生成的ModelMetadata類型實例中賦值到ContainerType屬性,表示著新生成的ModelMetadata類型實例比如叫A,A中描述的信息就是Customer類型中的CustomerID屬性的所有信息,而A中的ContainerType屬性就是表示描述的CustomerID屬性是屬于哪個類型的。

這里還有要說的,就是在系統默認生成的時候,比如說視圖模型是Customer類型,那么MVC框架只會生成一個ModelMetadata類型的實例假使它叫M,因為M自身并沒有自己檢測自己是不是復雜類型,所以M是不會調用提供器往下生成的,而是在外部要使用M了才會去調用M中的函數檢測M是不是復雜類型然后往下生成,假使現在MVC框架中使用到了這個M可能就會調用檢測它自身的方法來檢查它是不是復雜類型,明顯的Customer類型是復雜類型,這個時候M會按照本篇描述的那樣依次的生成它所描述類型中的屬性,也只是僅限于這一層,有的朋友可能會問在Customer類型中Address屬性也是復雜類型,對的,但是M只會去生成Address屬性本身的ModelMetadata類型的實例,而不會去生成Address屬性的內部。

現在大家再看一次圖2,是不是有點清晰的感覺。

(有哪位大神知道在MVC框架中是在哪里調用ModelMetadata類型實例的自身檢測的?知道的告知一下小弟以身相許,找的頭破血流也沒找到,我相信是肯定有的)

本篇結束,下篇中詳細介紹DataAnnotationsModelMetadataProvider類型中的CreateMetadata()方法,從這個方法進入,詳細的講解ModelMetadata對象類型。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西乌| 江西省| 大丰市| 凤庆县| 新乐市| 瑞金市| 海安县| 定远县| 西畴县| 钦州市| 汤阴县| 醴陵市| 资源县| 射阳县| 双桥区| 怀远县| 华蓥市| 同江市| 上杭县| 沾益县| 前郭尔| 高邑县| 佳木斯市| 民县| 项城市| 冷水江市| 聂拉木县| 张北县| 宁陵县| 营口市| 呼玛县| 克拉玛依市| 应城市| 科技| 苍溪县| 自贡市| 社旗县| 东山县| 峨山| 邵东县| 汉阴县|