前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MVC项目开发中那些用到的知识点(MVC IModelBinder)

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

作者头像
aehyok
发布2019-02-25 17:38:24
7390
发布2019-02-25 17:38:24
举报
文章被收录于专栏:技术博客技术博客

前言

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

IModelBinder

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

代码语言:javascript
复制
    // 摘要:
    //     定义模型联编程序所需的方法。
    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

代码语言:javascript
复制
        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中进行调用

代码语言:javascript
复制
    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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-05-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档