在上篇中介绍了自动绑定的基本用法,在本篇中,我们将深入了解自动绑定的工作原理.
自动绑定的确是让人感到兴奋的特性,然而,为了让它可以在我们的项目中更好的工作,我们有必要深入了解如何更进一步细调该特性以及它是如何工作的.而本文正式即将揭开这个谜底.
为了更好的了解该特性,我们有必要到codeplex去下载一份asp.net mvc的源代码并分析之,在本文写作的时候,codeplex上已经放上了beta版的源码,如果想进一步了解的朋友可以下载并对照本文分析.
在beta版中,新增了自动绑定这一特性,并对绑定特性做了一定的修改
新增BindAttribute:自动绑定特性设置
修改DefaultModelBinder:自动绑定的实现部分
修改ControllerActionInvoker:绑定的调用入口
新增ModelBinderContext,封装绑定所需数据
新增BinderResult,封装绑定结果
其他不大重要的修改略过
我们一步步来分析绑定的执行过程,首先肯定在ControllerActionInvoker中,看到GetParameterValue方法:
这儿便是对每个参数都尝试调用ModelBinder来绑定参数,这儿的GetModelBinder方法和P5的一样,在我们自定义ModelBinder的情况下可以进行自定义绑定,然而在自动绑定的时候获取的则是DefaultModelBinder,然后在GetPropertyFilter方法中通过查阅BindAttribute来获取关于绑定的设置.最后对数据进行绑定.
关键的,我们需要对DefaultModelBinder进行分析,然而在此之前,还有一个类也是需要我们仔细看看的,那就是BindAttribute,该特性是用来修饰参数的,它有4个重要的属性:Include,Exclude,Prefix和一个方法:IsPropertyAllowed,分别用来设定:绑定的字段,不绑定的字段,参数前缀和判断给定的字段是否设定运行绑定,且该方法会作为一个Predicate<string>委托封入ModelBinderContext传入BindModel方法.
现在来讨论使用默认绑定的情况,首先给出DefaultModelBinder的所有方法: