上篇內(nèi)容演示了一個(gè)簡單的Model驗(yàn)證示例,然后在文中提及到Model驗(yàn)證在MVC框架中默認(rèn)所處的位置在哪?本篇就是來解決 這個(gè)問題的,并且會描述一下ModelValidator類型對象相關(guān)的類型。
Model驗(yàn)證簡單運(yùn)用示例
ModelValidator使用生成過程
自定義實(shí)現(xiàn)DefaultModelBinder進(jìn)行驗(yàn)證
自定義ModelValidatorProvider 和ModelValidator
ValidationAttribute特性類使用
自定義ValidationAttribute特性類的示例實(shí)現(xiàn)
ModelValidator使用生成過程
首先請?jiān)试S我“盜”一張圖,這個(gè)示意圖是在我前面篇幅的ASP.NET MVC Model綁定(二)中的一張圖。
圖1
為什么要“盜”這個(gè)圖1,因?yàn)镸odel驗(yàn)證的過程將是在這個(gè)圖中的某個(gè)位置,對于這個(gè)示意圖的意思我就不詳細(xì) 說明了,只說明一下藍(lán)色線條部分,那是Model綁定器生成部分,我們需要的也是這個(gè)部分??聪聢D2
圖2
圖2的部分也是圖1中的,這樣一步步的分解下來,讓大家有個(gè)由大到小的由遠(yuǎn)到近的層次感,便于記憶和留下印象。這里有 的朋友會說了這是Model綁定部分拉過來有什么用?這個(gè)是有用的,看一下【IModelBinder.BindModel()】這個(gè)部分到【獲取控 制器方法參數(shù)值】部分,也就是整個(gè)Model綁定的過程了,主題是Model驗(yàn)證又扯綁定了,沒辦法阿,因?yàn)樵贛odel綁定之前會進(jìn) 行Model驗(yàn)證。
在我們沒有自定義Model綁定器的時(shí)候,系統(tǒng)默認(rèn)實(shí)現(xiàn)的都是DefaultModelBinder類型,那么我就來看一 下DefaultModelBinder類型的內(nèi)部的具體實(shí)現(xiàn)吧。。。
開個(gè)玩笑,是看一下內(nèi)部實(shí)現(xiàn)不過不是源碼而是示意圖(圖3),這樣給大家留個(gè)印象,感興趣的自己去扒源碼看吧。
圖3
感覺是不是有點(diǎn)坑,別急大家,坑誰不敢坑你們,實(shí)際上還有一條流程這里沒有顯示,這里顯示就是綁定復(fù)雜類型的Model所 要執(zhí)行的內(nèi)部方法。而在BindComplexModel)(方法內(nèi)部的實(shí)現(xiàn)里才會進(jìn)行Model驗(yàn)證,我們看一下方法的內(nèi)部執(zhí)行示意圖(圖4) 。
圖4
長話短說,執(zhí)行Model驗(yàn)證的過程是先執(zhí)行Model中的屬性級驗(yàn)證,然后執(zhí)行Model級驗(yàn)證。
在BindComplexElementalModel()方法中,首先會執(zhí)行BindProperties()方法,在此方法內(nèi)部會遍歷PropertyDescriptor集合 類型(圖4中顯示PropertyDescriptorCollection是不足的地方),正如大家所看到的一樣,SetProperty()方法才是最后真正對 Model屬性進(jìn)行驗(yàn)證的函數(shù)(下個(gè)篇幅會有講解實(shí)現(xiàn)自定義的Model綁定器執(zhí)行Model驗(yàn)證會講到這個(gè)方法)。
而在SetProperty()方法中真正執(zhí)行驗(yàn)證的,可以是自定義的,當(dāng)然了系統(tǒng)默認(rèn)的就是從 ModelValidatorProviders.Providers中獲取的了,所有驗(yàn)證的后的錯誤信息(假使有)都存在了ModelBindingContext類型的參數(shù)中了,以此向下傳遞。
驗(yàn)證完Model屬性后則會驗(yàn)證Model本身,就會調(diào)用OnModelUpdated()方法,這個(gè)方法有個(gè)毛病,就是自己不干 活,在它內(nèi)部使用CompositeModelValidator類型的實(shí)例來進(jìn)行驗(yàn)證,不過驗(yàn)證最后使用的還是 ModelValidatorProviders.Providers中我們自定義的ModelValidator類型或者是默認(rèn)的(這里具體的細(xì)節(jié)本人也沒有去細(xì)看, 大概的流程是這樣如果有誤差請指正,感激不盡)。
最后我們說一下ModelValidator類型的注冊,首先系統(tǒng)是不認(rèn)它的,它可能不是“親 生”的。系統(tǒng)的ModelValidatorProviders類型中的Providers屬性是ModelValidatorProviderCollection類型的,這下大 家應(yīng)該看到系統(tǒng)認(rèn)誰了吧,就是認(rèn)識ModelValidator類型的“爹”ModelValidatorProvider類型 (畢竟不是繼承關(guān)系),這里就不多說相關(guān)的模型了,跟前面好多的模型都相像。
對于自定義實(shí)現(xiàn)ModelValidator類型的示例演示在后續(xù)的篇幅中會有講到。
創(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ù)器買多久送多久。
文章名稱:ASP.NETMVCModel驗(yàn)證(二)-創(chuàng)新互聯(lián)
分享鏈接:http://aaarwkj.com/article6/jcdog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、用戶體驗(yàn)、關(guān)鍵詞優(yōu)化、做網(wǎng)站、企業(yè)網(wǎng)站制作、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容