ASP.NET MVC Model绑定(五)

摘要:
ASP.NETMVCModel绑定(五)前言前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本篇你将会对IValueProvider有个更清晰的印象。从图1中可以看到,在执行控制器方法之前,首先要获取Model绑定器,然后是执行Model绑定器,我们先把获取Model绑定器的部分流程放一放,先来看一下执行Model绑定器的流程。
ASP.NET MVC Model绑定(五)

前言

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

Model绑定

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

IValueProvider的应用场景

图1

ASP.NET MVC Model绑定(五)第1张

图1中所示的就是本篇所要演示的IValueProvider的简单示例了。这里不对图中的类型做讲解,看下文的示例代码自会知晓。

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

1. 控制器方法的定义

代码1-1

namespaceMvcApplication.Controllers
{
    public classValueProviderCaseController : Controller
    {

        public ActionResult Index(stringValueProviderCase)
        {
            ViewBag.value =ValueProviderCase;
            returnView();
        }

    }
}

代码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

usingSystem.Web.Mvc;

namespaceMvcApplication.ValueProvider
{
    public classMyCustomValueProvider:IValueProvider
    {
        public bool ContainsPrefix(stringprefix)
        {
            if (prefix == "ValueProviderCase")
            {
                return true;
            }
            return false;
        }

        public ValueProviderResult GetValue(stringkey)
        {
            returnContainsPrefix(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 classValueProviderResult
    {
        protectedValueProviderResult();
        public ValueProviderResult(object rawValue, stringattemptedValue, CultureInfo culture);
        public string AttemptedValue { get; protected set; }
        public CultureInfo Culture { get; protected set; }
        //
        //摘要:
        //获取或设置值提供程序所提供的原始值。
        //
        //返回结果:
        //原始值。
        public object RawValue { get; protected set; }
        public objectConvertTo(Type type);
        public virtual objectConvertTo(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

usingSystem.Web.Mvc;

namespaceMvcApplication.ValueProvider
{
    public classMyCustomValueProviderFactory:ValueProviderFactory
    {
        public overrideIValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            if (controllerContext.Controller.GetType().Name == "ValueProviderCaseController")
            {
                return newMyCustomValueProvider();
            }
            return null;
        }
    }
}

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

5.自定义Model绑定器

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

代码1-6

namespaceMvcApplication.Binders
{
    public classValueProviderModelBinder : IModelBinder
    {
        public objectBindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            returnbindingContext.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), newBinders.ValueProviderModelBinder());
ValueProviderFactories.Factories.Insert(0, new ValueProvider.MyCustomValueProviderFactory());

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

最后我们看一下结果图:

图2

ASP.NET MVC Model绑定(五)第2张

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

免责声明:文章转载自《ASP.NET MVC Model绑定(五)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQL必知必会TASKKILL命令使用大全下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

shell脚本之数组

declare-AARRAY_NAME:声明关联数组。数组中元素的赋值方式:一次只赋值一个元素;ARRAY_NAME[INDEX]=value一次赋值全部元素;ARRAY_NAME=注意:元素与元素之间使用空格字符隔开只赋值特定元素;这种称之为稀疏格式的数组。/bin/bash#declare-aranddeclare-imax=0foriin{1..10}...

内网esxi磁盘空间不足导致虚拟机宕机

因为一些占用太多空间的虚拟机可能无法启动。我不断拍摄快照以保存测试版本。我跳过了同一网段上的一个虚拟机ssh,并一直看着翻译器学习如何释放虚拟磁盘空间。您只能创建一个新的虚拟机来读取原始磁盘目录,并且只能重新构建一个新Linux机器进行测试。然后上传一个测试文件(最大程度地模拟其他虚拟机环境)。首先,你需要关闭机器。厚配置延迟将整个虚拟机目录文件清零,如下所...

iReport制作报表,字数过多换行问题

1.当字段中显示的数据太长而无法放入表中时,需要自动换行。选择要更改的表(显示动态内容的字段),并将Stretchwithoverflow属性设置为选中。未选中前:选中后:2.然而,桌子坏了,非常难看。此时,我们需要设置一个属性,使同一行中的其他字段保持与换行字段相同的高度。此时,我们需要框选要显示在整行中的动态字段和表;将属性StretchType设置为R...

vue页面出现乱码,那么就需要在当前页面设置编码为utf-8

如果HTML在中文中出现乱码,则将其修改如下:必须将其设置为zh-CN简体中文。如果设置为lang=“en”,则表示英语,如果内容是中文,则可能会出现乱码或者它可以缩写为:或请记住,元中只有两个属性。两个值:http equiv=“Content-Type”Content=“text/html;charset=utf-8”//值中有一个分号。中国常用代码:u...

halo项目源码本地部署解决方案

找不到build-info.properties文件(运行时)Beanmethod'buildProperties'in'ProjectInfoAutoConfiguration'notloaded@ConditionalOnResourcedidnotfindresource'${spring.info.build.location:classpath:M...

CMD命令行正确显示中文

如果要在命令行中正确显示UTF-8字符,可以执行以下步骤:1.打开CMD exe命令行窗口2.通过chcp命令更改代码页。UTF-8的代码页为65001chcp65001。执行此操作后,代码页将变为UTF-8。但是,UTF-8字符无法在窗口中正确显示。此时,使用type命令显示UTF-8文本文件的内容:typefilename Txt4。上述操作无法完全解决...