ASP.NETMVCModel元數(shù)據(jù)(二)

ASP.NET MVC Model元數(shù)據(jù)(二)

前言

在上篇中,給大家留個對Model元數(shù)據(jù)的印象,并沒有對Model元數(shù)據(jù)有過多的講解,而在本篇中也不會對Model元數(shù)據(jù)的本身來解釋,而是針對于它的生成過程,讓大家能夠清楚的了解到系統(tǒng)框架是在什么時候生成Model元數(shù)據(jù)的,對于Model元數(shù)據(jù)生成篇幅初定為兩篇,本篇為它的整體的生成過程,下篇則為詳細(xì)的生成過程并且會對它本身做一個粗略的介紹,希望大家看完能夠有所收獲

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)由有經(jīng)驗(yàn)的網(wǎng)站設(shè)計師、開發(fā)人員和項(xiàng)目經(jīng)理組成的專業(yè)建站團(tuán)隊(duì),負(fù)責(zé)網(wǎng)站視覺設(shè)計、用戶體驗(yàn)優(yōu)化、交互設(shè)計和前端開發(fā)等方面的工作,以確保網(wǎng)站外觀精美、成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)易于使用并且具有良好的響應(yīng)性。

 

Model元數(shù)據(jù)

  • 什么是Model元數(shù)據(jù)?

  • 生成Model元數(shù)據(jù)的過程【一】

  • 生成Model元數(shù)據(jù)的過程【二】

  • ModelMetaData的定義、詳解

  • Model元數(shù)據(jù)應(yīng)用(常用特性應(yīng)用)-1

  • Model元數(shù)據(jù)應(yīng)用(自定義視圖模板)-2

  • Model元數(shù)據(jù)應(yīng)用(IMetadataAware接口使用)-3

 

生成Model元數(shù)據(jù)的過程【一】

還是如前篇說的那樣,既然叫Model元數(shù)據(jù)(Model指的是視圖模型)那么肯定跟Model有關(guān)系了,而在我們MVC項(xiàng)目中一般是什么時候會對Model進(jìn)行操作呢?一般情況下都是在通過控制器的行為請求一個視圖的時候,而控制器行為的參數(shù)即為Model,然后在行為方法中做一些處理然后再傳遞給視圖。然后再根據(jù)上篇最后的一個示意圖來看,

圖1

 ASP.NET MVC Model元數(shù)據(jù)(二)

生成Model元數(shù)據(jù)的地方已經(jīng)鎖定到了行為方法,想象一下肯定是不可能在行為方法中來生成的,因?yàn)槟鞘俏覀冏远x邏輯的地方。那是在什么地方呢?

想必大家看過之前的對過濾器篇幅的介紹,在ASP.NET MVC 過濾器(三)中對行為過濾器的執(zhí)行過程講解的時候,中間有提到過模型綁定器,并且說到了系統(tǒng)框架所要使用到的自定義模型綁定器,而使用這個自定義模型綁定器所需要的兩個參數(shù)是非常重要的,一個是表示當(dāng)前控制器上下文的對象ControllerContext,另一個則是生成Model元數(shù)據(jù)的關(guān)鍵,也是調(diào)用自定義模型綁定器的關(guān)鍵參數(shù)ModelBindingContext類型??聪?/p>

圖2

ASP.NET MVC Model元數(shù)據(jù)(二)

 

而在ModelBindingContext類型中有個重要的屬性,即為Model元數(shù)據(jù)類型ModelMetadata,由此可以知道在我們的控制器行為執(zhí)行之前,對應(yīng)控制器行為的Model的Model元數(shù)據(jù)ModelMetadata類型已經(jīng)生成了。(這部分內(nèi)容詳見過濾器篇幅)

而它是怎么生成的呢?是通過系統(tǒng)框架中默認(rèn)提供的提供程序來生成的,是哪些個類型呢?

圖3

ASP.NET MVC Model元數(shù)據(jù)(二)

那我們就先看一下最頂層的基類ModelMetadataProvider的定義:

代碼1-1

public abstract class ModelMetadataProvider
    {
        // 摘要:
        //     在派生類中重寫時,初始化派生自 System.Web.Mvc.ModelMetadataProvider 類的對象的新實(shí)例。
        protected ModelMetadataProvider();
        public abstract IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType);
        public abstract ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName);
        public abstract ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType);
    }

 

非常明白的定義,三個抽象方法,這里我們只需先看GetMetadataForType()方法,其它兩個暫時不管下篇中會有講到,因?yàn)橄瓤碐etMetadataForType()方法呢?因?yàn)樗巧?strong>ModelMetadata類型的入口,第一個參數(shù)暫時忽略,第二個參數(shù)嘛很重要了,是ParameterDescriptor類型的ParameterType屬性,表示著Model的類型(也就是控制器方法參數(shù)的Type類型),現(xiàn)在我們來看下圖4

圖4

ASP.NET MVC Model元數(shù)據(jù)(二)

 

圖4中藍(lán)色線條為主要流程,紅色線條是在藍(lán)色處理之后執(zhí)行的流程。

上面說到,入口方法是為抽象方法,那是怎么具體實(shí)現(xiàn)的呢,從圖4中可以看到是由實(shí)現(xiàn)了ModelMetadataProvider的類型AssociatedMetadataProvider類型來進(jìn)行處理的,從圖4可以看到首先是獲取一個AttributeList的類型,AttributeList類型表示著從AssociatedMetadataProvider類型GetMetadataForType()方法參數(shù)modelType類型上的特性集合,對了AssociatedMetadataProvider類型是比較重要的類型,我們先來看一下它的定義:

public abstract class AssociatedMetadataProvider : ModelMetadataProvider
    {
        protected AssociatedMetadataProvider();
        protected abstract ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName);
        protected virtual IEnumerable<Attribute> FilterAttributes(Type containerType, PropertyDescriptor propertyDescriptor, IEnumerable<Attribute> attributes);
        public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType);
        protected virtual ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, PropertyDescriptor propertyDescriptor);
        public override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName);
        public override ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType);
        protected virtual ICustomTypeDescriptor GetTypeDescriptor(Type type);
    }

方法有點(diǎn)多,暫時不用管,大多數(shù)方法都是用來在遞歸生成Model元數(shù)據(jù)的時候使用的(具體的過程會在下篇中講解)。好了切回主題接著上面的內(nèi)容來說,AttributeList類型的由來,是通過ModelMetadataProvider的GetTypeDescriptor()方法根據(jù)Model的類型(這里暫且先這么理解,等看完下個篇幅就會知道這里也有可能是Model中的屬性類型)來生成一個ICustomTypeDescriptor類型(可以想象成這是對于一種對象類型元數(shù)據(jù)描述對象的抽象定義。讀起來有點(diǎn)繞口,但是確實(shí)是這么個意思)。而系統(tǒng)會有個默認(rèn)的自定義實(shí)現(xiàn)來實(shí)現(xiàn)這個接口類型,我們通過這個默認(rèn)的實(shí)現(xiàn)來獲得Model類型的AttributeList類型。

在有了AttributeList類型后,我們就可以調(diào)用AssociatedMetadataProvider類型的CreateMetadata()方法來創(chuàng)建Model元數(shù)據(jù)對象,但是這個CreateMetadata()的定義是抽象的,而真正的實(shí)現(xiàn)是由繼承了AssociatedMetadataProvider類型的DataAnnotationsModelMetadataProvider類型,由此過后我們生成得到ModelMetadata元數(shù)據(jù)對象(真正的過程比較繁瑣,不然也不會另起一篇專門用來講解生成的過程),得到了Model元數(shù)據(jù)對象過后并沒有結(jié)束,而是繼續(xù)調(diào)用了AssociatedMetadataProvider類型的ApplyMetadataAwareAttributes()方法,并在此方法中,系統(tǒng)框架會調(diào)用我們自定義實(shí)現(xiàn)了IMetadataAware接口類型的對象,來對Model元數(shù)據(jù)對象進(jìn)行個性化修改,并且最后才會真正的返回Model元數(shù)據(jù)對象。

有可能看到這里有的朋友對Model元數(shù)據(jù)還是不怎么清楚和了解,朋友們急我也急,如果我分享的這些知識大家看完都不知所云那我又是何必呢。先不要急看了多少就是多少在看完這個Model元數(shù)據(jù)系列的文章后應(yīng)該會有所了解,將在后續(xù)的篇章中慢慢的揭開它的秘密。謝謝大家的支持。

網(wǎng)頁題目:ASP.NETMVCModel元數(shù)據(jù)(二)
文章起源:http://muchs.cn/article2/pdgcoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化網(wǎng)站收錄、服務(wù)器托管外貿(mào)網(wǎng)站建設(shè)、建站公司、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營