亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

ASP.NET MVC Model元數據(二)

發布時間:2020-08-07 22:44:48 來源:網絡 閱讀:839 作者:jinyuan0829 欄目:編程語言

ASP.NET MVC Model元數據(二)

前言

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

 

Model元數據

  • 什么是Model元數據?

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

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

  • ModelMetaData的定義、詳解

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

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

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

 

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

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

圖1

 ASP.NET MVC Model元數據(二)

生成Model元數據的地方已經鎖定到了行為方法,想象一下肯定是不可能在行為方法中來生成的,因為那是我們自定義邏輯的地方。那是在什么地方呢?

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

圖2

ASP.NET MVC Model元數據(二)

 

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

而它是怎么生成的呢?是通過系統框架中默認提供的提供程序來生成的,是哪些個類型呢?

圖3

ASP.NET MVC Model元數據(二)

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

代碼1-1

public abstract class ModelMetadataProvider
    {
        // 摘要:
        //     在派生類中重寫時,初始化派生自 System.Web.Mvc.ModelMetadataProvider 類的對象的新實例。
        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()方法,其它兩個暫時不管下篇中會有講到,因為先看GetMetadataForType()方法呢?因為它是生成ModelMetadata類型的入口,第一個參數暫時忽略,第二個參數嘛很重要了,是ParameterDescriptor類型的ParameterType屬性,表示著Model的類型(也就是控制器方法參數的Type類型),現在我們來看下圖4

圖4

ASP.NET MVC Model元數據(二)

 

圖4中藍色線條為主要流程,紅色線條是在藍色處理之后執行的流程。

上面說到,入口方法是為抽象方法,那是怎么具體實現的呢,從圖4中可以看到是由實現了ModelMetadataProvider的類型AssociatedMetadataProvider類型來進行處理的,從圖4可以看到首先是獲取一個AttributeList的類型,AttributeList類型表示著從AssociatedMetadataProvider類型GetMetadataForType()方法參數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);
    }

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

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

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




向AI問一下細節

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

AI

新巴尔虎左旗| 诸城市| 海阳市| 商河县| 噶尔县| 思南县| 拉萨市| 桂平市| 天镇县| 尉犁县| 龙门县| 台江县| 东兰县| 阿拉尔市| 崇义县| 离岛区| 蓬莱市| 普格县| 临漳县| 湖南省| 九寨沟县| 中超| 民和| 沅江市| 伊宁县| 文化| 香格里拉县| 娱乐| 改则县| 高陵县| 醴陵市| 庆元县| 北辰区| 柯坪县| 西充县| 霞浦县| 健康| 绥宁县| 临漳县| 揭东县| 台东市|