ASP.NET MVC Model绑定(五)
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中很简单的定义了一个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(, new ValueProvider.MyCustomValueProviderFactory());
将代码1-7添加到Application_Start()方法中,首先是向系统注册了我们自定义的Model绑定器,然后将自定义的值提供程序工厂添加到系统,这里用了Insert()方法来添加,目的是想让我的这个工厂处在默认的之前在第一个的位置,省的再一个个的去判断浪费时间。也可以用Add()方法,只不过是添加到了尾处。
最后我们看一下结果图:
图2

作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC Model绑定(五)的更多相关文章
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model元数据(五)
ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...
- ASP.NET MVC Model绑定(六)
ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框 ...
- ASP.NET MVC Model绑定(四)
ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...
- ASP.NET MVC Model绑定(三)
ASP.NET MVC Model绑定(三) 前言 看过前两篇的朋友想必对Model绑定有个大概的了解,然而MVC框架给我们提供了更高的可扩展性的提供程序编程模式,也就是本篇的主题了,会讲解一下Mod ...
- ASP.NET MVC Model绑定(二)
ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...
- ASP.NET MVC Model绑定(一)
ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...
- ASP.NET MVC Model绑定
ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...
- ModelBinder——ASP.NET MVC Model绑定的核心
ModelBinder——ASP.NET MVC Model绑定的核心 Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过 ...
随机推荐
- 在WPF中使用依赖注入的方式创建视图
在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...
- ABP文档 - Javascript Api - Message
本节内容: 显示信息 确认 Message API给用户显示一个信息,或从用户那里获取一个确认信息. Message API默认使用sweetalert实现,为使sweetalert正常工作,你应该包 ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
- transtion:过渡动画
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Monaco; color: #4f5d66 } p.p2 { margin: 0.0px 0 ...
- 前端学HTTP之web攻击技术
前面的话 简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标.本文将详细介绍攻击web站点 ...
- MFC中如何画带实心箭头的直线
工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决:思路如下: (1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度 (2)以P2为原点得到向量P2P1 ...
- HTML5轻松实现搜索框提示文字点击消失---及placeholder颜色的设置
在做搜索框的时候无意间发现html5的input里有个placeholder属性能轻松实现提示文字点击消失功能,之前还傻傻的在用js来实现类似功能... 示例 <form action=&quo ...
- Redis简单案例(二) 网站最近的访问用户
我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我们可以先简单了解一下在oracle.sqlserve ...
- iOS微信第三方登录实现
iOS微信第三方登录实现 一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...
- Mach-O 的动态链接(Lazy Bind 机制)
➠更多技术干货请戳:听云博客 动态链接 要解决空间浪费和更新困难这两个问题最简单的方法就是把程序的模块相互分割开来,形成独立的文件,而不再将它们静态的链接在一起.简单地讲,就是不对那些组成程序的目标文 ...