在前面的两篇文章中,我们研究了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,更加来享受改变带来的好处.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构