重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决 这个问题的,并且会描述一下ModelValidator类型对象相关的类型。
成都创新互联公司网站建设由有经验的网站设计师、开发人员和项目经理组成的专业建站团队,负责网站视觉设计、用户体验优化、交互设计和前端开发等方面的工作,以确保网站外观精美、成都做网站、成都网站建设易于使用并且具有良好的响应性。
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类型的内部的具体实现吧。。。
开个玩笑,是看一下内部实现不过不是源码而是示意图(图3),这样给大家留个印象,感兴趣的自己去扒源码看吧。
图3
感觉是不是有点坑,别急大家,坑谁不敢坑你们,实际上还有一条流程这里没有显示,这里显示就是绑定复杂类型的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类型的示例演示在后续的篇幅中会有讲到。