上篇對于Model綁定的簡單演示想必大家對Model綁定的使用方式有一點(diǎn)的了解,那大家有沒有想過Model綁定器是在什么時(shí)候執(zhí)行的?又或是執(zhí)行的過程是什么樣的?將在本篇為大家解除這些疑惑,在其中涉及到的一些描述類型和上下文參數(shù)會在后續(xù)的篇幅中講到。
10年積累的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有臨漳免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。IModelBinder、自定義Model綁定器簡單實(shí)現(xiàn)
Model綁定器在MVC框架中的位置
MVC中的默認(rèn)Model綁定器生成過程
IModelBinderProvider的簡單應(yīng)用
IValueProvider在MVC框架中生成的位置以及過程
IValueProvider的應(yīng)用場景
IValueProvider的實(shí)現(xiàn)之NameValueCollectionValueProvider
不廢話直接進(jìn)入主題,Model綁定器顧名思義是為了Model的綁定提供幫助的這么一個(gè)功能模塊,暫且就這么理解。Model這里所指的就是ViewModel,一般都是在控制器方法參數(shù)中使用Model,從而使Model綁定器可以使用起來,可是有沒有想過為什么要這樣用呢?世間的事物都是有因果的,當(dāng)然這樣的使用方式也逃脫不了,這跟MVC框架中生成Model綁定器的位置是有關(guān)系的,我們來看示意圖1。
圖1
看到圖1,可能有的朋友可能覺得很突兀,這里建議朋友們先去看一下博主前面所寫過的ASP.NET MVC過濾器系列的文章,看過的朋友肯定就會覺得很熟悉了,但也要考慮沒有看過前面篇幅的朋友。
ControllerActionInvoker類型的InvokeAction()方法是MVC框架中執(zhí)行控制器方法的必經(jīng)方法,我們就按照圖1所示的來講解,***的指示線條為主要流程(雖然不是流程圖)。首先MVC會生成一個(gè)ControllerDescriptor類型,然后根據(jù)ControllerDescriptor類型再生成ActionDescriptor類型,然后再根據(jù)ActionDescriptor類型生成FilterInfo類型的對象,對于ControllerDescriptor類型和ActionDescriptor類型分別表示著控制器描述類型(對象內(nèi)部包含著控制器的各種信息)和控制器方法描述類型(同控制器描述類型一個(gè)意思),這兩個(gè)類型的含義和生成過程后面篇幅會有講解,這里暫時(shí)只需了解它們代表著什么就行。
對于FilterInfo類型的解釋是它包含著當(dāng)前所被調(diào)用的控制其方法上的所有過濾器信息(博主還是建議朋友們?nèi)タ碅SP.NET MVC過濾器系列的文章),從它的結(jié)構(gòu)中可以看出它包含著各種類型過濾器類型集合對象屬性。
重點(diǎn)來了,從圖1中可以看出MVC框架會先執(zhí)行授權(quán)認(rèn)證IAuthorizationFilter過濾器,在執(zhí)行完IAuthorizationFilter過濾器后和執(zhí)行控制器行為過濾器IActionFilter之前,MVC會根據(jù)ActionDescriptor類型獲取到ParameterDescriptor類型的對象【這里說句題外話看過前面Model元數(shù)據(jù)的朋友,想必知道ParameterDescriptor類型和Model元數(shù)據(jù)的都是用來描述Model的,ParameterDescriptor類型重在描述Model本身,而Model元數(shù)據(jù)更側(cè)重于Model的外部修飾,感嘆MVC的強(qiáng)大】。
然后再根據(jù)ParameterDescriptor類型中ParameterType屬性,表示著Model的類型(Type類型)來生成Model綁定器(IModelBinder),至于生成的細(xì)節(jié)在下一小節(jié)來講解,不能搶樓下的生意。
想必大家現(xiàn)在知道為什么要把ViewModel放在控制器方法中作為參數(shù)來使用了吧。
本小節(jié)講解Model綁定器生成的具體過程,也不是太復(fù)雜,并且會在后續(xù)篇幅控制器方法執(zhí)行篇幅會將這些知識點(diǎn)全部串聯(lián)起來。
現(xiàn)在我們還是先看一下Model綁定器生成的細(xì)節(jié)吧,圖2
圖2
(黑體字部分表示為屬性名稱,黑體字前面的青色表示屬性類型,而在黑體字上面的表示屬性所屬類型)
按照圖2所示的來講解,首先MVC調(diào)用了ControllerActionInvoker類型的GetModelBinder ()方法來生成IModelBinder類型,在方法的內(nèi)部,MVC首先會判斷參數(shù)parameterDescriptor中的BindingInfo屬性中的Binder屬性是否為空,如果為空的話(此部分內(nèi)容在下篇中會詳解ParameterDescriptor類型,并且以反推的方法來往上講解幾種描述類型),則是調(diào)用ControllerActionInvoker類型中的Binders屬性。
現(xiàn)在我們就來看一下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中可以清楚的看到,對于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; }
這里沒有其它的意思,就是讓大家看一下系統(tǒng)默認(rèn)提供的幾種Model綁定器類型,同樣是使用ModelBinderDictionary類型的Add()方法,唯一不同的就是這是在系統(tǒng)啟動時(shí)就會添加生成好的,而我們自定義的Model綁定器則是后面手動添加的。
切回主題,從圖2中我們可以看到在ModelBinderDictionary類型調(diào)用GetBinder()方法的時(shí)候?qū)嶋H是調(diào)用的ModelBinderProviderCollection類型的GetBinder()方法,其實(shí)在ModelBinderDictionary類型的內(nèi)部有著一個(gè)ModelBinderProviderCollection類型的字段,再看圖2,在實(shí)際調(diào)用ModelBinderProviderCollection類型的GetBinder()方法的時(shí)候其實(shí)真正調(diào)用的是IModelBinderProvider類型中的GetBinder()方法。
然而在反編譯工具中也有反編譯不了的,好比ModelBinderProviderCollection類型,我就沒看到它實(shí)例化的細(xì)節(jié),不過沒關(guān)系在下一篇中會證明出來它的內(nèi)部細(xì)節(jié)。
本篇內(nèi)容就講解到這,后續(xù)的篇幅中會講解如何使用這些類型來實(shí)現(xiàn)生成Model綁定器并且進(jìn)行Model綁定。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。