溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET MVC Model綁定(二)

發(fā)布時(shí)間:2020-07-04 09:07:15 來(lái)源:網(wǎng)絡(luò) 閱讀:762 作者:jinyuan0829 欄目:編程語(yǔ)言

ASP.NET MVC Model綁定(二)

前言

上篇對(duì)于Model綁定的簡(jiǎn)單演示想必大家對(duì)Model綁定的使用方式有一點(diǎn)的了解,那大家有沒(méi)有想過(guò)Model綁定器是在什么時(shí)候執(zhí)行的?又或是執(zhí)行的過(guò)程是什么樣的?將在本篇為大家解除這些疑惑,在其中涉及到的一些描述類(lèi)型和上下文參數(shù)會(huì)在后續(xù)的篇幅中講到。

 

Model綁定

  • IModelBinder、自定義Model綁定器簡(jiǎn)單實(shí)現(xiàn)

  • Model綁定器在MVC框架中的位置

  • MVC中的默認(rèn)Model綁定器生成過(guò)程

  • IModelBinderProvider的簡(jiǎn)單應(yīng)用

  • IValueProvider在MVC框架中生成的位置以及過(guò)程

  • IValueProvider的應(yīng)用場(chǎng)景

  • IValueProvider的實(shí)現(xiàn)之NameValueCollectionValueProvider

 

Model綁定器在MVC框架中的位置

不廢話直接進(jìn)入主題,Model綁定器顧名思義是為了Model的綁定提供幫助的這么一個(gè)功能模塊,暫且就這么理解。Model這里所指的就是ViewModel,一般都是在控制器方法參數(shù)中使用Model,從而使Model綁定器可以使用起來(lái),可是有沒(méi)有想過(guò)為什么要這樣用呢?世間的事物都是有因果的,當(dāng)然這樣的使用方式也逃脫不了,這跟MVC框架中生成Model綁定器的位置是有關(guān)系的,我們來(lái)看示意圖1。

圖1

ASP.NET MVC Model綁定(二)

看到圖1,可能有的朋友可能覺(jué)得很突兀,這里建議朋友們先去看一下博主前面所寫(xiě)過(guò)的ASP.NET MVC過(guò)濾器系列的文章,看過(guò)的朋友肯定就會(huì)覺(jué)得很熟悉了,但也要考慮沒(méi)有看過(guò)前面篇幅的朋友。

ControllerActionInvoker類(lèi)型的InvokeAction()方法是MVC框架中執(zhí)行控制器方法的必經(jīng)方法,我們就按照?qǐng)D1所示的來(lái)講解,***的指示線條為主要流程(雖然不是流程圖)。首先MVC會(huì)生成一個(gè)ControllerDescriptor類(lèi)型,然后根據(jù)ControllerDescriptor類(lèi)型再生成ActionDescriptor類(lèi)型,然后再根據(jù)ActionDescriptor類(lèi)型生成FilterInfo類(lèi)型的對(duì)象,對(duì)于ControllerDescriptor類(lèi)型和ActionDescriptor類(lèi)型分別表示著控制器描述類(lèi)型(對(duì)象內(nèi)部包含著控制器的各種信息)和控制器方法描述類(lèi)型(同控制器描述類(lèi)型一個(gè)意思),這兩個(gè)類(lèi)型的含義和生成過(guò)程后面篇幅會(huì)有講解,這里暫時(shí)只需了解它們代表著什么就行。

對(duì)于FilterInfo類(lèi)型的解釋是它包含著當(dāng)前所被調(diào)用的控制其方法上的所有過(guò)濾器信息(博主還是建議朋友們?nèi)タ碅SP.NET MVC過(guò)濾器系列的文章),從它的結(jié)構(gòu)中可以看出它包含著各種類(lèi)型過(guò)濾器類(lèi)型集合對(duì)象屬性。

重點(diǎn)來(lái)了,從圖1中可以看出MVC框架會(huì)先執(zhí)行授權(quán)認(rèn)證IAuthorizationFilter過(guò)濾器,在執(zhí)行完IAuthorizationFilter過(guò)濾器后和執(zhí)行控制器行為過(guò)濾器IActionFilter之前,MVC會(huì)根據(jù)ActionDescriptor類(lèi)型獲取到ParameterDescriptor類(lèi)型的對(duì)象【這里說(shuō)句題外話看過(guò)前面Model元數(shù)據(jù)的朋友,想必知道ParameterDescriptor類(lèi)型和Model元數(shù)據(jù)的都是用來(lái)描述Model的,ParameterDescriptor類(lèi)型重在描述Model本身,而Model元數(shù)據(jù)更側(cè)重于Model的外部修飾,感嘆MVC的強(qiáng)大】。

然后再根據(jù)ParameterDescriptor類(lèi)型中ParameterType屬性,表示著Model的類(lèi)型(Type類(lèi)型)來(lái)生成Model綁定器(IModelBinder),至于生成的細(xì)節(jié)在下一小節(jié)來(lái)講解,不能搶樓下的生意。

想必大家現(xiàn)在知道為什么要把ViewModel放在控制器方法中作為參數(shù)來(lái)使用了吧。

 

MVC中的默認(rèn)Model綁定器生成過(guò)程

本小節(jié)講解Model綁定器生成的具體過(guò)程,也不是太復(fù)雜,并且會(huì)在后續(xù)篇幅控制器方法執(zhí)行篇幅會(huì)將這些知識(shí)點(diǎn)全部串聯(lián)起來(lái)。

現(xiàn)在我們還是先看一下Model綁定器生成的細(xì)節(jié)吧,圖2

圖2

ASP.NET MVC Model綁定(二)

黑體字部分表示為屬性名稱(chēng),黑體字前面的青色表示屬性類(lèi)型,而在黑體字上面的表示屬性所屬類(lèi)型

按照?qǐng)D2所示的來(lái)講解,首先MVC調(diào)用了ControllerActionInvoker類(lèi)型的GetModelBinder ()方法來(lái)生成IModelBinder類(lèi)型,在方法的內(nèi)部,MVC首先會(huì)判斷參數(shù)parameterDescriptor中的BindingInfo屬性中的Binder屬性是否為空,如果為空的話(此部分內(nèi)容在下篇中會(huì)詳解ParameterDescriptor類(lèi)型,并且以反推的方法來(lái)往上講解幾種描述類(lèi)型),則是調(diào)用ControllerActionInvoker類(lèi)型中的Binders屬性。

現(xiàn)在我們就來(lái)看一下Binders屬性的定義,如代碼1-1。

代碼1-1

        protected internal ModelBinderDictionary Binders
        {
            get
            {
                if (this._binders == null)
                {
                    this._binders = ModelBinders.Binders;
                }
                return this._binders;
            }
            set
            {
                this._binders = value;
            }
        }

從代碼1-1中可以清楚的看到,對(duì)于Binders屬性的使用實(shí)際是在使用當(dāng)前系統(tǒng)上下文中的ModelBinders.Binders屬性,這里先暫停一下,我們看下ModelBinders.Binders屬性中系統(tǒng)給默認(rèn)提供的綁定器,代碼1-2。

代碼1-2

        private static ModelBinderDictionary CreateDefaultBinderDictionary()
        {
            ModelBinderDictionary dictionary2 = new ModelBinderDictionary();
            dictionary2.Add(typeof(HttpPostedFileBase), new HttpPostedFileBaseModelBinder());
            dictionary2.Add(typeof(byte[]), new ByteArrayModelBinder());
            dictionary2.Add(typeof(Binary), new LinqBinaryModelBinder());
            return dictionary2;
        }

這里沒(méi)有其它的意思,就是讓大家看一下系統(tǒng)默認(rèn)提供的幾種Model綁定器類(lèi)型,同樣是使用ModelBinderDictionary類(lèi)型的Add()方法,唯一不同的就是這是在系統(tǒng)啟動(dòng)時(shí)就會(huì)添加生成好的,而我們自定義的Model綁定器則是后面手動(dòng)添加的。

切回主題,從圖2中我們可以看到在ModelBinderDictionary類(lèi)型調(diào)用GetBinder()方法的時(shí)候?qū)嶋H是調(diào)用的ModelBinderProviderCollection類(lèi)型的GetBinder()方法,其實(shí)在ModelBinderDictionary類(lèi)型的內(nèi)部有著一個(gè)ModelBinderProviderCollection類(lèi)型的字段,再看圖2,在實(shí)際調(diào)用ModelBinderProviderCollection類(lèi)型的GetBinder()方法的時(shí)候其實(shí)真正調(diào)用的是IModelBinderProvider類(lèi)型中的GetBinder()方法。

然而在反編譯工具中也有反編譯不了的,好比ModelBinderProviderCollection類(lèi)型,我就沒(méi)看到它實(shí)例化的細(xì)節(jié),不過(guò)沒(méi)關(guān)系在下一篇中會(huì)證明出來(lái)它的內(nèi)部細(xì)節(jié)。

本篇內(nèi)容就講解到這,后續(xù)的篇幅中會(huì)講解如何使用這些類(lèi)型來(lái)實(shí)現(xiàn)生成Model綁定器并且進(jìn)行Model綁定。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI