专栏首页技术博客MVC项目开发中那些用到的知识点(MVC IModelBinder)

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

前言

本节主要来记录一下客户端发送请求的参数自动绑定为强类型的成员属性或方法参数也就是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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#简单的面试题目(三)

    31.C#提供一个默认的无参构造函数,当我实现了另外一个有一个参数的构造函数时,还想保留这个无参数的构 造函数。这样我应该写几个构造函数?     两个,一...

    aehyok
  • C#类和结构体的异同点简单总结

    类和结构的异同点? 异:  1.关键字不同 一个是class,一个是struct     2.类型不同,一个是引用类型,一个是值类型(一个堆区,一个栈区)   ...

    aehyok
  • 一步一步学Linq to sql(九):其它补充

    5、现在就可以照常进行其它工作了。使用sqlmetal可以很方便的同步数据库与实体和映射文件。每次修改数据库结构,从dbml设计器上删除表、存储过程然后再重新添...

    aehyok
  • 与时俱进 | 博客现已运行在 .NET Core 3.0 及 Azure 上

    9月23日,微软正式发布了 .NET Core 3.0,这个版本具有大量新功能和改进。我也在第一时间将自己的博客网站更新到了 .NET Core 3.0,并且仍...

    Edi Wang
  • VS2010如何做WAP开发

    自从VS2010 RC出来以后,就顺便把机器重做了,重装的时候特意没安装VS2008,全线过渡到VS2010和.net4.0,但今天有一小WAP项目,才意识到V...

    菩提树下的杨过
  • SEO指南:FLash网站,该如何去优化!

    Flash网站与SEO优化是一个老生常谈的话题,虽然目前搜索引擎都在尽力的抓取Flash站点,但我们仍然不建议大家去搭建一个Flash网站,特别是当你的目标客户...

    蝙蝠侠IT
  • 谷歌浏览器团队:感谢 Flash 所做的一切

    今天早上(译者注:2017年7月25日),Adobe宣布他们计划在2020年底结束对Flash的支持。对于Flash开发人员来说,这意味着将要过渡到HTML,因...

    疯狂的技术宅
  • 使用Selenium WebDriver进行闪存测试

    Flash测试是一种测试类型,用于检查基于Flash的视频,游戏,电影等是否按预期工作。换句话说,测试闪存的功能称为“ 闪存测试”。Flash是Mircomed...

    用户7466307
  • 中国特供版Flash:死期将至,何以再掀波澜

    没想到,在正式宣布其“死刑”之后一年,Flash 在国内却以这样一种方式成为热议话题。Adobe 近期与国内一家公司达成合作,为国内用户提供特供版Flash,并...

    FB客服
  • 打卡群刷题总结0717——不同路径 II

    链接:https://leetcode-cn.com/problems/unique-paths-ii

    木又AI帮

扫码关注云+社区

领取腾讯云代金券