欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC Model验证(二)

程序员文章站 2022-07-01 15:16:21
asp.net mvc model验证(二) 前言 上篇内容演示了一个简单的model验证示例,然后在文中提及到model验证在mvc框架中默认所处的位置在哪?本篇就是来解决这个问...

asp.net mvc model验证(二)

前言

上篇内容演示了一个简单的model验证示例,然后在文中提及到model验证在mvc框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下modelvalidator类型对象相关的类型。

model验证

model验证简单运用示例modelvalidator使用生成过程自定义实现defaultmodelbinder进行验证自定义modelvalidatorprovider 和modelvalidator validationattribute特性类使用自定义validationattribute特性类的示例实现

modelvalidator使用生成过程

首先请允许我“盗”一张图,这个示意图是在我前面篇幅的asp.net mvc model绑定(二)中的一张图。

图1

ASP.NET MVC Model验证(二)

为什么要“盗”这个图1,因为model验证的过程将是在这个图中的某个位置,对于这个示意图的意思我就不详细说明了,只说明一下蓝色线条部分,那是model绑定器生成部分,我们需要的也是这个部分。看下图2

图2

ASP.NET MVC Model验证(二)

图2的部分也是图1中的,这样一步步的分解下来,让大家有个由大到小的由远到近的层次感,便于记忆和留下印象。这里有的朋友会说了这是model绑定部分拉过来有什么用?这个是有用的,看一下【imodelbinder.bindmodel()】这个部分到【获取控制器方法参数值】部分,也就是整个model绑定的过程了,主题是model验证又扯绑定了,没办法阿,因为在model绑定之前会进行model验证。

在我们没有自定义model绑定器的时候,系统默认实现的都是defaultmodelbinder类型,那么我就来看一下defaultmodelbinder类型的内部的具体实现吧。。。喎? f/ware/vc/"="" target="_blank" class="keylink">vcd4kpha+v6q49s3m0kajrmrhv7tsu8/cxnqyv8q1z9ayu7n9srvkx9s0wuu2+mrhyr7s4s28o6jnvdojqaos1elr+bj4tpo80sh0upbtoc/zo6y40ndlyks1xnfuvlripbdh1ltc67+0smmhozwvcd4kpha+zbwzpc9wpgo8cd48aw1nihnyyz0="/uploadfile/collfiles/20140710/20140710090258219.png" alt="\">

感觉是不是有点坑,别急大家,坑谁不敢坑你们,实际上还有一条流程这里没有显示,这里显示就是绑定复杂类型的model所要执行的内部方法。而在bindcomplexmodel)(方法内部的实现里才会进行model验证,我们看一下方法的内部执行示意图(图4)。

图4

ASP.NET MVC Model验证(二)

长话短说,执行model验证的过程是先执行model中的属性级验证,然后执行model级验证。

在bindcomplexelementalmodel()方法中,首先会执行bindproperties()方法,在此方法内部会遍历propertydescriptor集合类型(图4中显示propertydescriptorcollection是不足的地方),正如大家所看到的一样,setproperty()方法才是最后真正对model属性进行验证的函数(下个篇幅会有讲解实现自定义的model绑定器执行model验证会讲到这个方法)。

而在setproperty()方法中真正执行验证的,可以是自定义的,当然了默认的就是从modelvalidatorproviders.providers中获取的了,所有验证的后的错误信息(假使有)都存在了modelbindingcontext类型的参数中了,以此向下传递。

验证完model属性后则会验证model本身,就会调用onmodelupdated()方法,这个方法有个毛病,就是自己不干活,在它内部使用compositemodelvalidator类型的实例来进行验证,不过验证最后使用的还是modelvalidatorproviders.providers中我们自定义的modelvalidator类型或者是默认的(这里具体的细节本人也没有去细看,大概的流程是这样如果有误差请指正,感激不尽)。

最后我们说一下modelvalidator类型的注册,首先系统是不认它的,它可能不是“亲生”的。系统的modelvalidatorproviders类型中的providers属性是modelvalidatorprovidercollection类型的,这下大家应该看到系统认谁了吧,就是认识modelvalidator类型的“爹”modelvalidatorprovider类型(毕竟不是继承关系),这里就不多说相关的模型了,跟前面好多的模型都相像。

对于自定义实现modelvalidator类型的示例演示在后续的篇幅中会有讲到。


作者:金源

出处:https://blog.csdn.net/jinyuan0829

本文版权归作者和csdn共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

喎?>