ASP.NET MVC Model绑定(五)

前言

前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了解说,本篇将会对IValueProvider的使用做个基础的演示样例解说,读完本篇你将会对IValueProvider有个更清晰的印象。

Model绑定

  • IModelBinder、自己定义Model绑定器简单实现
  • Model绑定器在MVC框架中的位置
  • MVC中的默认Model绑定器生成过程
  • IModelBinderProvider的简单应用
  • IValueProvider在MVC框架中生成的位置以及过程
  • IValueProvider的应用场景
  • IValueProvider的实现之NameValueCollectionValueProvider

IValueProvider的应用场景

图1

图1中所看到的的就是本篇所要演示的IValueProvider的简单演示样例了。

这里不正确图中的类型做解说。看下文的演示样例代码自会知晓。

首先红色方框所看到的的就是主要流程了,我们先来实现一下:

1.  控制器方法的定义

代码1-1

namespace MvcApplication.Controllers
{public class ValueProviderCaseController : Controller{public ActionResult Index(string ValueProviderCase){ViewBag.value = ValueProviderCase;return View();}}
}

代码1-1中非常easy的定义了一个Index()方法。而且參数类型(Model类型)为string类型。參数名称(Model名称)为ValueProviderCase,请大家记住这个參数名称后面会用到的。

2.视图呈现端代码

代码1-2

@{ViewBag.Title = "Index";
}<h2>Index</h2>
<p>@ViewBag.value</p>

代码1-2为视图呈现端代码,这里用了ViewBag动态类型来传值。

从图1中能够看到。在运行控制器方法之前。首先要获取Model绑定器。然后是运行Model绑定器,我们先把获取Model绑定器的部分流程放一放。先来看一下运行Model绑定器的流程。

3.自己定义值提供程序的定义

从图1中看到。在运行Model绑定器的流程中。最后是运行的自己定义值提供程序MyCustomValueProvider,这里我们先无论其它的,看一下这个类型的定义:

代码1-3

using System.Web.Mvc;namespace MvcApplication.ValueProvider
{public class MyCustomValueProvider:IValueProvider{public bool ContainsPrefix(string prefix){if (prefix == "ValueProviderCase"){return true;}return false;}public ValueProviderResult GetValue(string key){return ContainsPrefix(key)?

new ValueProviderResult( "这是一个值提供程序演示样例",null,System.Globalization.CultureInfo.InstalledUICulture) :null; } } }

看到代码1-3中MyCustomValueProvider的定义,小伙伴们莫慌待我慢慢解释。首先MyCustomValueProvider类型实现了IValueProvider接口类型。这个是必须的。对于IValueProvider接口类型的定义我就不放代码了。也就是MyCustomValueProvider类型的的两个方法了。

ContainsPrefix()方法的意思是值提供程序内部推断是否含有指定的前缀,把值提供程序想象成一个数据源。这个数据源中包括了键和值,这个ContainsPrefix()方法就是用来推断指定的键是否存在,假设存在的话GetValue()方法则会返回相应的值(在我们的演示样例中这里的ContainsPrefix()仅仅是作了一逻辑推断。推断当前控制器方法的參数名称【Model名称】是否为ValueProviderCase)。

而GetValue()方法的意思上面也说到了。就是用来返回指定前缀的值(指定键的值),在我们的演示样例中仅仅是返回了"这是一个值提供程序演示样例"。

有的朋友可能发现了GetValue()方法的返回类型并非String类型,而是ValueProviderResult类型,这是MVC框架干的好事,也就是它要我们强制的封装我们的返回值。没办法受制于人封装就封装吧,小伙伴们看一下ValueProviderResult类型的定义:

代码1-4

public class ValueProviderResult{protected ValueProviderResult();public ValueProviderResult(object rawValue, string attemptedValue, CultureInfo culture);public string AttemptedValue { get; protected set; }public CultureInfo Culture { get; protected set; }//// 摘要://     获取或设置值提供程序所提供的原始值。

// // 返回结果: // 原始值。 public object RawValue { get; protected set; } public object ConvertTo(Type type); public virtual object ConvertTo(Type type, CultureInfo culture); }

看到代码1-4中的ValueProviderResult类型的构造函数定义和RawValue属性的凝视了吧。然后再看一下代码1-3中GetValue()方法的代码定义。一目了然吧。

4.自己定义值提供程序工厂定义

切回主要流程,我们在使用Model绑定器中的自己定义值提供程序的同一时候,我们也要回忆一下上一个篇幅中所讲的就是自己定义值提供程序的由来,自己定义值提供程序是由我们自己定义值提供程序工厂生成的。然后把这个工厂注冊到系统的ValueProviderFactories. Factories中,然后会在Model绑定器运行之前生成ModelBindingContext类型实例的时候从ValueProviderFactories. Factories中获取到自己定义值提供程序(MyCustomValueProvider类型)赋值到ModelBindingContext类型实例的属性ValueProvider上(对于这里的过程能够观看上一篇)。

如今我们看一下自己定义值提供程序工厂定义,代码1-5.

代码1-5

using System.Web.Mvc;namespace MvcApplication.ValueProvider
{public class MyCustomValueProviderFactory:ValueProviderFactory{public override IValueProvider GetValueProvider(ControllerContext controllerContext){if (controllerContext.Controller.GetType().Name == "ValueProviderCaseController"){return new MyCustomValueProvider();}return null;}}
}

代码1-5中GetValueProvider()方法被我加入了个逻辑推断。想指示这个工厂仅仅为ValueProviderCaseController控制器服务,这里大家都好理解的就不多说了。

5.自己定义Model绑定器

再次回到主要流程。上面说过先看Model绑定器运行部分的,如今来看Model绑定器获取部分流程。不多说直接来看自己定义Model绑定器的定义。代码1-6.

代码1-6

namespace MvcApplication.Binders
{public class ValueProviderModelBinder : IModelBinder{public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){return bindingContext.ValueProvider.GetValue(bindingContext.ModelName).RawValue;}
}
}

代码1-6中通过bindingContext中的ValueProvider属性有着对值提供程序的引用,调用了代码1-3中的GetValue()方法,而且把參数名称传递过去进行逻辑推断。最后通过返回值ValueProviderResult类型的RawValue直接返回我们定义的值。

6.将我们自己定义的"乱七八糟"类型注冊到MVC框架中

通过上面那些类型的定义还是不够的,我们还须要将他们注冊到系统中,惯例我们在Global.asax文件里加入,当然也能够在控制器激活的过程中进行注冊。针对特定的控制器定制特定的Model绑定器。当然了在实际的项目开发有用不有用不清楚,仅仅是这样感觉Global.asax文件里会“干净”一点。

不瞎扯了,来看注冊的代码定义1-7.

代码1-7

ModelBinders.Binders.Add(typeof(string), new Binders.ValueProviderModelBinder());
ValueProviderFactories.Factories.Insert(0, new ValueProvider.MyCustomValueProviderFactory());

将代码1-7加入到Application_Start()方法中,首先是向系统注冊了我们自己定义的Model绑定器。然后将自己定义的值提供程序工厂加入到系统,这里用了Insert()方法来加入。目的是想让我的这个工厂处在默认的之前在第一个的位置,省的再一个个的去推断浪费时间。

也能够用Add()方法,仅仅只是是加入到了尾处。

最后我们看一下结果图:

图2

作者:金源

出处:http://blog.csdn.net/jinyuan0829

本文版权归作者和CSDN共同拥有。欢迎转载,但未经作者允许必须保留此段声明,且在文章页面

ASP.NET MVC Model绑定(五)相关推荐

  1. ASP.NET MVC Model元数据(五)

    ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...

  2. ASP.NET MVC Model绑定(二)

    ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...

  3. ASP.NET MVC Model绑定(四)

    ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...

  4. ModelBinder——ASP.NET MVC Model绑定的核心

    Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过ParameterDescriptor来描述,ParameterDesc ...

  5. ASP.NET MVC Model绑定小结

    Model绑定是指从URL提取数据,生成对应Action方法的参数这个过程.前面介绍的一系列Descriptor负责提供了控制器,行为方法和参数的元数据,ValueProvieder负责获取数据,剩下 ...

  6. 艾伟_转载:学习 ASP.NET MVC (第五回)理论篇

    本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回) ...

  7. 学习 ASP.NET MVC (第五回)理论篇

    通过前几篇文章,我们通过ASP.NET MVC创建了一个简单的应用程序,学习了ASP.NET MVC的基本框架和工作流程.但是Demo中很多东西都是VS为我们自动生成的,比如View的html代码等. ...

  8. ASP.NET MVC XML绑定Action参数列表

    昨天查看了 ASP.NET MVC 的生命周期,并没有找到类似的解决方案. 不过今天在 stackoverflow上找到了解决方案,没耐心的同学可以直接戳原文拷贝代码,原文地址:How to pass ...

  9. ASP.NET MVC模型绑定int超出范围时

    ASP.NET MVC后台在接受int 参数时,如果html页面输入的数值不是介于-2,147,483,648 到 2,147,483,647.那么ASP.NET MVC会自动将其转换成0 转载于:h ...

最新文章

  1. 英文书《用unreal来学习c++》_用机器学习来提升你的用户增长:第四步,客户流失预测
  2. 4.1 深层神经网络-深度学习-Stanford吴恩达教授
  3. aspx练习备忘录#想锤自己两拳#1
  4. 《开源成长策略——Talend 成功模式》邀请函
  5. java——springmvc——注册中央调度器
  6. 【报告分享】中国人工智能产业发展指数.pdf
  7. php连接memcache(php.ini配置)
  8. 【基于STM32F407IGT6】STemWin5.20d + uCOS-III + FatFS程序下载
  9. CDH5 Hadoop如何支持读写OSS
  10. 初步学习pg_control文件之十四
  11. 开机启动项快捷方式所在的目录
  12. 服务器装系统蓝屏怎么办,重装系统蓝屏怎么办
  13. Html静态页面更新,解决浏览器缓存不更新问题
  14. 显微镜下的大明内容_《显微镜下的大明》读后感
  15. 如何处理WordPress上传资源报HTTP错误
  16. sql盲注 解决_sql盲注-和sql盲注相关的内容-阿里云开发者社区
  17. linux驱动调试技巧:灌寄存器---------以mma7660为例
  18. 为什么java中的时间是从1970年1月1日开始的?
  19. ATX 690 旋飞换卡飞 7速升级8速 21速升24速 方法
  20. 中学生计算机语言,中学生编程(初中生有必要学编程吗)

热门文章

  1. 心情随笔(六):金秋十月备考之路亦别有一番风味
  2. Google发布超难问答数据集「自然问题」:30万对问答,BERT都达不到70分
  3. Linus送出圣诞礼物:发布Linux 4.20,超35万行代码
  4. 第四范式完成超10亿元C轮融资,估值12亿美元
  5. 荣耀Magic2 发布:滑盖全面屏、前后6摄、屏下指纹、麒麟980
  6. CMU计算机学院院长Andrew Moore离职,下一任院长人选未定
  7. Hinton反思新作:我说反向传播不好,但还是没谁能颠覆它
  8. Google惊人研究:一组图片,就能强迫神经网络执行其他任务
  9. import 和 export -- ES6
  10. 实例解说 fdisk 使用方法