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