asp.net mvc model验证(二)

前言

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

model验证

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

modelvalidator使用生成过程

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

图1

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

图2

图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

长话短说,执行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共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面