现在的位置: 主页 > 公司荣誉 > 文章列表

ASP.NET MVC Model验证(二)

作者:合肥瑶海区海美电器服务部 来源:www.an128l.com 未知发布时间:2017-09-12 15:43:34
ASP.NET MVC Model验证(二) 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类型的内部的具体实现吧。。。vcD4KPHA+v6q49s3m0KajrMrHv7TSu8/CxNqyv8q1z9ayu7n9srvKx9S0wuu2+MrHyr7S4s28o6jNvDOjqaOs1eLR+bj4tPO80sH0uPbToc/zo6y40NDLyKS1xNfUvLrIpbDH1LTC67+0sMmhozwvcD4KPHA+zbwzPC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/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类型的示例演示在后续的篇幅中会有讲到。


作者:金源

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

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

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:恩施SEO http://enshi.raoyu.net

上一篇:Python标准库:内置函数exec(object[, globals[, loca 下一篇:最后一页