在前面的两篇文章中,我们研究了Asp.Net Mvc Preview5的ViewEingine的改进,从本篇开始,我们开始研究Preview5中的新特性:ModelBinder.
首先我们来了解下什么是ModelBinder特性,这有什么用处,在以前的版本中,如果我们要在Action中获取数据,一般有三种方式,一是通过Action的参数,但是由于某些原因,这儿只能获取到简单类型的参数,比如int,string等,第二种方式是通过Request来获取,但是当数据较多的时候,这个方式实在太费劲了.三是使用BindingHelperExtensions中的扩展方法,但是这种方式还是不能满足我们的要求.我们理想中的方式是:
如果能这样写,将直接能在参数中方便获取传入对象.会使得程序的结构更加合理.在新版中,框架引入ModelBinder来解决了这个问题,使得我们理想中的效果得以实现.
ModlBinder的作用就是建立一种html参数和对象的转换关系,可以通过系统内置或者用户添加的Binder来完成转换过程,每当Action中含有参数的时候,系统会自动查询url或者表单中是否含有相应的值,然后调用一定的ModelBinder对象来将参数转化成传入的值.
下面我们来分析下ModelBinder的工作过程.我们知道,Action的执行实际上实在ControllerActionInvoker中进行的,这个类中提供了一些方法,在执行的过程中,它首先找到Controller中Action对应的Method,然后判断Method是否带有参数,如果有参数,将使用特定的方式来对这些参数赋值.这部分具体的代码我们弄出来瞧瞧:
系统为Method的每个参数都调用了GetParameterValue方法,而这个方法中再次调用GetModelBinder方法来获取对应的ModelBinder,最后执行GetValue来使用这个ModelBinder从ControllerContext中获取对应的数据并返回(我们不再详细查看系统自带ModelBinder的GetValue的实现),特别注意ModelBinder方法,它会先判断参数是否含有CustomAttrubutes.如果没有,则调用ModelBinders.GetBinder根据该参数本身的类型从系统中注册过的ModelBinder中查找ModelBinder,如果设定了该Attrubutes,则获取设定的CustomAttrubutes并调用其GetBinder方法来获取ModelBinder.
ModelBinders是一个ModelBinder的管理器.这个管理器的实现和ViewEngines非常类似.都提供一个默认的ModelBinder,以及一个ModelBinder容器.同样,我们发现系统会内置一些常用的ModelBinder,如图:
这儿添加了对DateTime和DateTime?的ModelBinder.而对应一些简单对象,系统拥有一个DefaultModelBinder来处理,它在ModelBindersInfo中被初始化.如图:
综上,我们能了解系统中ModelBinder的工作原理,在下篇中,我们将通过实际的例子来实际运用ModelBinder,更加来享受改变带来的好处.