当前位置: 首页 > news >正文

一起谈.NET技术,ASP.NET MVC 2扩展点之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["Sex"];
// ...
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; }
public DateTime DatePublished { 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");
book.Author = GetValue<string>(bindingContext, "Author");
book.DatePublished = GetValue<DateTime>(bindingContext, "DatePublished");
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添加下面代码:

ModelBinders.Binders.Add(typeof(Book), new BookModelBinder());

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

转载于:https://www.cnblogs.com/waw/archive/2011/08/29/2158666.html

相关文章:

  • 2011百度实习生笔试题目
  • 从零开始学习OpenGL ES之五补遗 – setupView重写
  • .NET大文件上传知识整理
  • HDU 1075 What Are You Talking About
  • iPhone公用代码库开源代码网址(cc_team贡献,陈曦,陈旭)
  • 利用autobench测试web服务器极限并发数(带使用说明)
  • 在centos 5.6 64位配置puppet 服务端和客户端(二)
  • wmware启动进行BIOS方法
  • 一份不错的学习c networking programming的教程
  • 关于Mysql的数据列表的分页显示
  • 浅谈 chukwa 在数据收集处理方面的应用
  • 实用HTML,CSS和JavaScript速查表
  • HDU 3395 Special Fish
  • dedecms5.7技术:“更新数据库archives表时出错,请检查
  • 如何在Ubuntu 11.10下安装Java
  • 深入了解以太坊
  • 自己简单写的 事件订阅机制
  • (三)从jvm层面了解线程的启动和停止
  • 【5+】跨webview多页面 触发事件(二)
  • 【Leetcode】104. 二叉树的最大深度
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • C++类中的特殊成员函数
  • classpath对获取配置文件的影响
  • Hibernate最全面试题
  • JS专题之继承
  • Laravel Telescope:优雅的应用调试工具
  • laravel5.5 视图共享数据
  • Linux gpio口使用方法
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • oschina
  • PHP的Ev教程三(Periodic watcher)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • vue--为什么data属性必须是一个函数
  • hi-nginx-1.3.4编译安装
  • postgresql行列转换函数
  • Prometheus VS InfluxDB
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​Java并发新构件之Exchanger
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • $.proxy和$.extend
  • ${factoryList }后面有空格不影响
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)nsfocus-绿盟科技笔试题目
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • 、写入Shellcode到注册表上线
  • .Net6使用WebSocket与前端进行通信
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NET企业级应用架构设计系列之应用服务器
  • .Net中的集合
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理