Model Binder在Asp.net MVC中非常简单。简单的说就是你控制器中的Action方法需要参数数据;而这些参数数据包含在HTTP请求中,包括表单上的Value和URL中的参 数等。而ModelBinder的功能就是将这些个表单上的Value和URL中的参数换成对象,然后将这些对象绑定到Action的参数上面。我简单的 画了一个图,看起来会更加直观。

  在asp.net mvc中你可以写类似下面这样的代码:

[HttpPost]public ActionResult Create(){Book book = new Book(); book.Title = Request.Form["Title"];// ...return View();}

  但是这样的写法是非常不可取的,因为代码不容易阅读,也不易测试。再看下面的写法:

[HttpPost]public ActionResult Create(FormCollection values){Book book = new Book(); book.Title = values["Title"];// ...return View();}

  这样的写法就可以不用从Request中获取数据了,这样能满足一些情况,比直接从Request中获取数据要直观。但是如果在Action需要的数据既要来自表单上的值,又要来自URL的query string。这种情况单单FormCollection是不行的。看下面代码:

[HttpPost]public ActionResult Create(Book book){// ...return View();} 

  上面的代码就非常的直观了,这需要我们的model binder创建一个book对象,然后直接从这个对象的属性中取值。这个book对象的数据自然也是来自Form和URL。有时候,我们的 DefaultModelBinder转换的能力必经有限,也不够透明化,一些特殊和复杂的情况就需要我们自定义Model Binder。下面我讲讲如何去自定义Model Binder。

  1、首先我们定义一个Book的实体类:

public class Book{public string Title { get; set; }public string Author { get; set; }}

  2、自定义的model binder需要继承IModelBinder或者它的子类。数据可以从bindingContext获取。

public class BookModelBinder : IModelBinder{

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {var book = (Book)(bindingContext.Model ?? new Book()); book.Title = GetValue<string>(bindingContext, "Title")+"www";//这里在获取到表单的Title信息后随便追加个"www",用来测试的 book.Author = GetValue<string>(bindingContext, "Author");if (String.IsNullOrEmpty(book.Title)) { bindingContext.ModelState.AddModelError("Title", "书名不能为空?");//添加错误信息 }return book; }private T GetValue<T>(ModelBindingContext bindingContext, string key) {ValueProviderResult valueResult= bindingContext.ValueProvider.GetValue(key); bindingContext.ModelState.SetModelValue(key, valueResult);return (T)valueResult.ConvertTo(typeof(T)); }}

  从上面代码可以看出,自定义的ModelBinde非常的自由,可以自由的将Form上的一个key对应实体的一个属性,也可以加入一些验证的逻辑。当然还可以加入一些其他的自定义逻辑。

  3、写好BookModelBinder之后,我们只需要简单的注册一下就行了,在Global.asax添加下面代码:

    protected void Application_Start()        {            ModelBinders.Binders.Add(typeof(Book), new BookModelBinder());            AreaRegistration.RegisterAllAreas();

            RegisterRoutes(RouteTable.Routes);        }

  4、View中的表单代码:

    <form action="Show" method="post">
            书名:<input type="text" name="Title"/><br />
            作者:<input type="text" name="Author" /><br />
            <input type="submit" value="提交" />
        </form>

  5、Controller中对应的Action的代码:

   public ActionResult Show(Book book)
        {
            return View();
        }

  在Action中可以通过添加断点来查看book对象中的信息,是通过ModelBinder来进行绑定信息的。

  总结:本文简单介绍了一下Asp.net MVC的Model Binder机制。如果叙述有问题,欢迎指正

ASP.NET MVC2之Model Binder相关推荐

  1. 【飞秋】Asp.net MVC2 model验证 看似美好,实则让人失望。

    最近几天看了一下Asp.net MVC2的model验证,初始的感觉让我眼前一亮,于是去看了看它的源代码,Validation和Metadata部分应该是从Dynamic Data哪里得到的灵感,一切 ...

  2. Asp.net MVC2.0系列文章-运行Web MVC2.0 Demo

    安装VS2010 首先安装VS2010,安装过程请参考文章: http://www.cnblogs.com/ywqu/archive/2010/01/27/1657450.html. 创建第一个MVC ...

  3. Asp.net MVC2.0系列文章-MVC简介篇

    使用微软VS工具开发Web应用程序主要有两种方式:一种是常用的创建Asp.net Web Forms,另外一种就是今天着重介绍的Asp.net  MVC. <?XML:NAMESPACE PRE ...

  4. Asp.net MVC2.0系列文章-编辑和删除新闻操作

    上一篇文章,我们简单地完成了新闻内容的展示功能(Asp.net MVC2.0系列文章-显示列表和详细页面操作),此篇文章,我们使用Asp.net MVC2.0实现新闻记录的编辑和删除功能. 创建Vie ...

  5. 一起谈.NET技术,ASP.NET MVC2.0在Tab页中实现异步无刷新分页

    概述 很多地方都存在以Tab页来呈现数据的方式,比如网易.新浪.搜狐.QQ等知名的门户网站的首页,还有大家熟知的博客园首页,都是用了tab页来显示数据.大家之所以喜欢用Tab,因为它能大大的增加显示数 ...

  6. Asp.net MVC2使用第三方控件

    ASP.net MVC框架提供了大量的HTML渲染的方法和控件,但是使用起来有诸多的不便.对于有经验的设计者使用HTML helpers可以构建一个简单的用户界面,然后加上一些HTML和css就能构建 ...

  7. Asp.Net MVC2.0 Url 路由入门---实例篇

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

  8. MVC的Model Binder总结

    今年一直在做一个mvc的项目,现在已经初具规模,适时的总结一下,也算是对MVC框架的一次更深入的研究. 由于时间以及成员技术水平的原因,在开发过程中,一直秉持:完成功能为第一,然后再完善其他的准则.作 ...

  9. ASP.NET MVC2+MSSQL+Godaddy

    先感谢一下博客园,在网上浪了这么长时间,现在发现还是博客园的文章技术含量要高一点! 现在言归正传,最近在课外学习ASP.NET MVC,也在微软的官网上学了一些例子教程,现在刚好有机会可以实践一下,一 ...

最新文章

  1. CHKDSK解决文件损坏无法打开E盘
  2. pycharm安装怎么选_客厅窗帘怎么选 客厅窗帘怎么安装好看
  3. 深入理解分布式技术 - 如何确保高可用
  4. 【H2 Database】导出CSV
  5. php 制造异常,php 异常
  6. 前端知识点回顾之重点篇——CORS
  7. java参数注解pam_CAS3.4 关于PAM模块SSL的详细配置
  8. 某“高人”谈论股市,对现在行情的分析
  9. 【免费】ArcGIS 10.8 软件下载及手把手安装教程(超详细)
  10. 虚拟机系统iso镜像下载_微软Windows 10 Build 19013(20H1)简体中文版ISO镜像可供下载...
  11. php中控车牌识别push协议,2、实时车牌识别上传及返回
  12. MATLAB | 迟到的圣诞树绘制
  13. VISUAL STUDIO调试器指南---断点和跟踪点
  14. 科学计数法符号e 自然常数e
  15. Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言
  16. PyQt4实时显示文本内容GUI
  17. java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
  18. 《JavaEE开发技术》课程考试试题(A卷)
  19. 滴滴程序员被亲戚鄙视:年薪八十万还不如二本教书的...
  20. 新年寄语 —— 奋斗2022

热门文章

  1. 的有效性最好_股票职业玩家教韭菜实战,验证技术指标的有效性,资产增值是王道...
  2. python requests 异步调用_构建高效的python requests长连接池详解
  3. java请求超时异常捕获_我异常了,快来捕获我,Java异常简述
  4. ibm服务器硬盘谁生产,IBM硬盘-昔日的开山鼻祖为何家道中落?
  5. redis 失效时间单位是秒还是毫秒_redis分布式锁的这些坑,我怀疑你是假的开发...
  6. css就近原则_CSS的引入方式和优先级
  7. 使用Scrapy,帮你快速抓取网页数据(代码可下载)!
  8. 如何利用大数据进行价值兑现才是正经事
  9. android aes256加密算法,Android中AES256加密的实现
  10. c语言基础知识孙小红,基于J2EE的C语言在线学习系统的设计与实现