ASP.NET MVC2之Model Binder
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相关推荐
- 【飞秋】Asp.net MVC2 model验证 看似美好,实则让人失望。
最近几天看了一下Asp.net MVC2的model验证,初始的感觉让我眼前一亮,于是去看了看它的源代码,Validation和Metadata部分应该是从Dynamic Data哪里得到的灵感,一切 ...
- Asp.net MVC2.0系列文章-运行Web MVC2.0 Demo
安装VS2010 首先安装VS2010,安装过程请参考文章: http://www.cnblogs.com/ywqu/archive/2010/01/27/1657450.html. 创建第一个MVC ...
- Asp.net MVC2.0系列文章-MVC简介篇
使用微软VS工具开发Web应用程序主要有两种方式:一种是常用的创建Asp.net Web Forms,另外一种就是今天着重介绍的Asp.net MVC. <?XML:NAMESPACE PRE ...
- Asp.net MVC2.0系列文章-编辑和删除新闻操作
上一篇文章,我们简单地完成了新闻内容的展示功能(Asp.net MVC2.0系列文章-显示列表和详细页面操作),此篇文章,我们使用Asp.net MVC2.0实现新闻记录的编辑和删除功能. 创建Vie ...
- 一起谈.NET技术,ASP.NET MVC2.0在Tab页中实现异步无刷新分页
概述 很多地方都存在以Tab页来呈现数据的方式,比如网易.新浪.搜狐.QQ等知名的门户网站的首页,还有大家熟知的博客园首页,都是用了tab页来显示数据.大家之所以喜欢用Tab,因为它能大大的增加显示数 ...
- Asp.net MVC2使用第三方控件
ASP.net MVC框架提供了大量的HTML渲染的方法和控件,但是使用起来有诸多的不便.对于有经验的设计者使用HTML helpers可以构建一个简单的用户界面,然后加上一些HTML和css就能构建 ...
- Asp.Net MVC2.0 Url 路由入门---实例篇
本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...
- MVC的Model Binder总结
今年一直在做一个mvc的项目,现在已经初具规模,适时的总结一下,也算是对MVC框架的一次更深入的研究. 由于时间以及成员技术水平的原因,在开发过程中,一直秉持:完成功能为第一,然后再完善其他的准则.作 ...
- ASP.NET MVC2+MSSQL+Godaddy
先感谢一下博客园,在网上浪了这么长时间,现在发现还是博客园的文章技术含量要高一点! 现在言归正传,最近在课外学习ASP.NET MVC,也在微软的官网上学了一些例子教程,现在刚好有机会可以实践一下,一 ...
最新文章
- CHKDSK解决文件损坏无法打开E盘
- pycharm安装怎么选_客厅窗帘怎么选 客厅窗帘怎么安装好看
- 深入理解分布式技术 - 如何确保高可用
- 【H2 Database】导出CSV
- php 制造异常,php 异常
- 前端知识点回顾之重点篇——CORS
- java参数注解pam_CAS3.4 关于PAM模块SSL的详细配置
- 某“高人”谈论股市,对现在行情的分析
- 【免费】ArcGIS 10.8 软件下载及手把手安装教程(超详细)
- 虚拟机系统iso镜像下载_微软Windows 10 Build 19013(20H1)简体中文版ISO镜像可供下载...
- php中控车牌识别push协议,2、实时车牌识别上传及返回
- MATLAB | 迟到的圣诞树绘制
- VISUAL STUDIO调试器指南---断点和跟踪点
- 科学计数法符号e 自然常数e
- Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言
- PyQt4实时显示文本内容GUI
- java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
- 《JavaEE开发技术》课程考试试题(A卷)
- 滴滴程序员被亲戚鄙视:年薪八十万还不如二本教书的...
- 新年寄语 —— 奋斗2022
热门文章
- 的有效性最好_股票职业玩家教韭菜实战,验证技术指标的有效性,资产增值是王道...
- python requests 异步调用_构建高效的python requests长连接池详解
- java请求超时异常捕获_我异常了,快来捕获我,Java异常简述
- ibm服务器硬盘谁生产,IBM硬盘-昔日的开山鼻祖为何家道中落?
- redis 失效时间单位是秒还是毫秒_redis分布式锁的这些坑,我怀疑你是假的开发...
- css就近原则_CSS的引入方式和优先级
- 使用Scrapy,帮你快速抓取网页数据(代码可下载)!
- 如何利用大数据进行价值兑现才是正经事
- android aes256加密算法,Android中AES256加密的实现
- c语言基础知识孙小红,基于J2EE的C语言在线学习系统的设计与实现