前言

本节主要来记录一下客户端发送请求的参数自动绑定为强类型的成员属性或方法参数也就是Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数。

IModelBinder

用于进行Model绑定的ModelBinder对象实现了接口IModelBinder。如下面的代码片断所示,IModelBinder接口具有唯一的BindModel方法用于实现针对某个参数的绑定操作,该方法的返回值表示的就是最终作为参数值的对象。用于进行Model绑定的ModelBinder对象实现了接口IModelBinder。如下面的代码片断所示,IModelBinder接口具有唯一的BindModel方法用于实现针对某个参数的绑定操作,该方法的返回值表示的就是最终作为参数值的对象。

    // 摘要://     定义模型联编程序所需的方法。public interface IModelBinder{// 摘要://     使用指定的控制器上下文和绑定上下文将模型绑定到一个值。//// 参数://   controllerContext://     控制器上下文。////   bindingContext://     绑定上下文。//// 返回结果://     绑定值。object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);}

IModelBinder的BindModel方法接受两个参数,一个是表示当前的Controller上下文,另一个是表示针对当前Model绑定的上下文,通过类型ModelBindingContext表示。在Controller初始化的时候,Controller上下文已经被创建出来,所以我们只要能够针对当前的Model绑定创建相应的ModelBindingContext,我们就能使用基于某个参数的ModelBinder得到对应的参数值。关于ModelBindingContext的创建我们会在后续部分进行的单独介绍,我们先来介绍一下ModelBinder的提供机制。

实现IModelBinder

新建UserInfoModelBinder类继承接口并实现IModelBinder

        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){object obj = Activator.CreateInstance(bindingContext.ModelType);foreach (PropertyInfo p in bindingContext.ModelType.GetProperties()){ValueProviderResult vpResult=  bindingContext.ValueProvider.GetValue(p.Name);if (vpResult != null){object value = vpResult.ConvertTo(p.PropertyType);p.SetValue(obj, value, null);}}return obj;}

这里有通过Activator.CreateInstance反射来定义一个对象。
通过在HomeController.cs中进行调用

    public class HomeController : Controller{public ActionResult Test([ModelBinder(typeof(UserInfoModelBinder))]UserInfo userInfo){return Content("Name:" + userInfo.Name + " Age:" + userInfo.Age);}

上面的bindingContext.ModelType其实就是Test的Action参数类型UserInfo。
接下来就是运行程序,通过MVC中的路由机制http://localhost:25943/Home/Test?Name=aehyok&age=25

转载于:https://www.cnblogs.com/aehyok/archive/2013/05/01/3052697.html

MVC项目开发中那些用到的知识点(MVC IModelBinder)相关推荐

  1. MVC项目开发中那些用到的知识点(Asp.Net Mvc3.0 Areas)

    前言 我们知道MVC项目各部分职责比较清晰,相比较ASP.NET Webform而言,MVC项目的业务逻辑和页面展现较好地分离开来,这样的做法有许多优点,比如可测试,易扩展等等.但是在实际的开发中,随 ...

  2. MVC项目开发中那些用到的知识点(登录权限认证)

    话说从开始接触MVC到现在也有一段时间了,记得好像是从2012年8月初开始做项目的.就记录一下自己所用到的且认为重要的知识点吧. 首先做的便是一个登录,那么就用到了登录权限认证: public cla ...

  3. uni-app看图项目开发中遇到的小问题/知识点(持续更新)

    一.若后台返回的数据带如/d的换行字符,要用<text>标签包裹 二.动态替换url中的id data(){return{ id:0, } url=`/${this.id}/` 三.分页的 ...

  4. React项目开发中的数据管理

    原文链接:https://blog.csdn.net/hl582567508/article/details/76982756 redux中文文档:http://cn.redux.js.org/ Re ...

  5. 项目开发中常用JS表单取值方法

    项目开发中常用JS表单取值方法 一.常用表单基本取值方法(form1为表单名称,TextBox1为控件ID,以文本框为例,html控件与web服务器控件是一样的)         1.form1.Te ...

  6. aspnet是前端还是后端_项目开发中无法回避的问题:前端和后端如何合作和并行工作?...

    项目开发中无法回避的问题:前端和后端如何合作和并行工作? 前端,后端要想非常愉快的合作开发和集成,那最开始第1步就是要定义一套共用的数据模型接口.这一步是所有工作可以顺利进行的前提. 数据模型接口之后 ...

  7. ssh项目同时使用mysql跟sqlserver数据库_MSSQL_如何把sqlserver数据迁移到mysql数据库及需要注意事项,在项目开发中,有时由于项目 - phpStudy...

    如何把sqlserver数据迁移到mysql数据库及需要注意事项 在项目开发中,有时由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Serve ...

  8. IntelliJ IDEA 项目开发中各个目录的关系

    项目根目录(Project Root):本地硬盘中存放项目内容的根目录 项目名称(Project Name):IDEA 保存的项目名称,默认和项目根目录的名称相同,可以修改.有啥作用?通过 IDEA ...

  9. 项目开发中发布更新文档备注

    项目开发中 经常会遇到 某一个团队成员更新了,配置文件但是没有及时沟通导致项目发布后出现异常的情况. 这时就需要一个项目更新发布的规范说明文件,比如每次更新更改了哪些,进行文档备注. 更新的脚本文件也 ...

最新文章

  1. CentOS7 自定义登录前后欢迎信息
  2. hdu3018 一笔画问题
  3. android 监听网络状态
  4. Java架构师必须知道的 6 大设计原则
  5. python wxpython backend wxagg_在wxPython中使用draw()(复制轴)绘制不正确
  6. Codeforces #123D: 后缀数组+单调栈
  7. php5.5 pdo mysql_PHP5中使用PDO连接数据库的方法
  8. 管理感悟:领导如何处理拍马
  9. 中国水电基础局携手友勤开展2018年P6软件培训班
  10. endpt matlab,将SDPT3配置到matlab
  11. scrapy_redis去重优化(已有7亿条数据),附Demo福利
  12. 发明专利费用减缓需要哪些资料?
  13. Power law and Power law distribution(幂律和幂律分布)
  14. JS配置KaTeX渲染LaTeX公式
  15. @RequestBody接受单个long参数
  16. 你绝没见过的奢华 全球最贵的13样东西
  17. Firemonkey arm-linux-androideabi-ld.exe: previous definition here
  18. 传奇3私服架设技术教程
  19. 想成为一名物联网工程师,需要学习哪些知识?
  20. 小车PWM调速-左右轮差速转弯

热门文章

  1. Pull解析Xml文件
  2. 多渠道归因分析:互联网的归因江湖(二)
  3. python︱写markdown一样写网页,代码快速生成web工具:streamlit 展示组件(三)
  4. R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
  5. 中文对比英文自然语言处理NLP的区别综述
  6. 自定义文件系统类加载器
  7. 解决gitlab限制上传大小文件的问题
  8. 八、Java的可变参数例子
  9. VS2010: Microsoft.TeamFoundation.PowerTools.CheckinPolicies.ChangesetComments 未注冊
  10. mysql隐藏文件一定要删除彻底