Leven's Blog

只谈技术
posts - 25, comments - 252, trackbacks - 18, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

         在前面的两篇文章中,我们研究了Asp.Net Mvc Preview5ViewEingine的改进,从本篇开始,我们开始研究Preview5中的新特性:ModelBinder.

         首先我们来了解下什么是ModelBinder特性,这有什么用处,在以前的版本中,如果我们要在Action中获取数据,一般有三种方式,一是通过Action的参数,但是由于某些原因,这儿只能获取到简单类型的参数,比如int,string,第二种方式是通过Request来获取,但是当数据较多的时候,这个方式实在太费劲了.三是使用BindingHelperExtensions中的扩展方法,但是这种方式还是不能满足我们的要求.我们理想中的方式是:


如果能这样写,将直接能在参数中方便获取传入对象.会使得程序的结构更加合理.在新版中,框架引入ModelBinder来解决了这个问题,使得我们理想中的效果得以实现.

        ModlBinder的作用就是建立一种html参数和对象的转换关系,可以通过系统内置或者用户添加的Binder来完成转换过程,每当Action中含有参数的时候,系统会自动查询url或者表单中是否含有相应的值,然后调用一定的ModelBinder对象来将参数转化成传入的值.

下面我们来分析下ModelBinder的工作过程.我们知道,Action的执行实际上实在ControllerActionInvoker中进行的,这个类中提供了一些方法,在执行的过程中,它首先找到ControllerAction对应的Method,然后判断Method是否带有参数,如果有参数,将使用特定的方式来对这些参数赋值.这部分具体的代码我们弄出来瞧瞧:




系统为Method的每个参数都调用了GetParameterValue方法,而这个方法中再次调用GetModelBinder方法来获取对应的ModelBinder,最后执行GetValue来使用这个ModelBinderControllerContext中获取对应的数据并返回(我们不再详细查看系统自带ModelBinderGetValue的实现),特别注意ModelBinder方法,它会先判断参数是否含有CustomAttrubutes.如果没有,则调用ModelBinders.GetBinder根据该参数本身的类型从系统中注册过的ModelBinder中查找ModelBinder,如果设定了该Attrubutes,则获取设定的CustomAttrubutes并调用其GetBinder方法来获取ModelBinder.

ModelBinders是一个ModelBinder的管理器.这个管理器的实现和ViewEngines非常类似.都提供一个默认的ModelBinder,以及一个ModelBinder容器.同样,我们发现系统会内置一些常用的ModelBinder,如图:

这儿添加了对DateTimeDateTime?ModelBinder.而对应一些简单对象,系统拥有一个DefaultModelBinder来处理,它在ModelBindersInfo中被初始化.如图:


综上,我们能了解系统中ModelBinder的工作原理,在下篇中,我们将通过实际的例子来实际运用ModelBinder,更加来享受改变带来的好处.

Feedback

#1楼   回复  引用  查看    

2008-08-31 10:24 by 重典      
。。。。。我也打算写来着。。。。大家看来都对这个感兴趣

#2楼[楼主]   回复  引用  查看    

2008-08-31 10:28 by Leven      
呵呵,这样也很好啊.

#3楼   回复  引用  查看    

2008-08-31 10:31 by 重典      
我去探索其它方面了。。。

#4楼   回复  引用  查看    

2008-08-31 13:18 by 紫色永恒      
此文章续篇将在不久的将来的下个月隆重登场

#5楼   回复  引用  查看    

2008-08-31 13:19 by Q.Lee.lulu      
GOOD
期待下篇!!
PS:分工合作,很好很强大

#6楼[楼主]   回复  引用  查看    

2008-08-31 13:25 by Leven      
呵呵.人多力量大嘛.

#7楼   回复  引用  查看    

2008-08-31 20:23 by Jeffrey Zhao      
楼主不错啊,加油

#8楼[楼主]   回复  引用  查看    

2008-08-31 20:28 by Leven      
@Jeffrey Zhao
感谢老赵的支持...

#9楼   回复  引用  查看    

2008-09-01 12:23 by 有容乃大      
期望精彩后文...

-------------------------------------------------
隆重发布.net项目开发工具(V3.0 ):
http://www.cnblogs.com/mrhgw/archive/2008/08/06/1261664.html" target="_new">http://www.cnblogs.com/mrhgw/archive/2008/08/06/1261664.html

#10楼   回复  引用    

2008-10-13 23:22 by 问问1 [未注册用户]
你的图是用什么软件截的呀?这么漂亮

#11楼[楼主]   回复  引用  查看    

2008-10-14 09:51 by Leven      
用的是SnagIt.
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1280481




相关文章:

相关链接:
CopyRight 2008, Leven's Blog xhtml | css
Leven的个人Blog