ASP.NET Web API Model-ValueProvider
前言
公司主营业务:网站设计制作、网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出柘城免费做网站回馈大家。
前面一篇讲解了Model元数据,Model元数据是在Model绑定中很重要的一部分,只是Model绑定中涉及的知识点比较多,对于ASP.NET MVC框架来说ASP.NET Web API框架中在Model绑定部分又新增了参数绑定这么一个机制,这些内容都会在后面的篇幅中说明,前面的这些篇幅都是讲解理论上的知识也没有涉及到示例的演示,这个大家不用急在最后Model部分的基础知识讲解完之后我会把前面所讲的全部串联起来,而今天这个篇幅给大家带来的就是在Model绑定中起到至关重要的一个环节,大家这个不用去管什么Model绑定,而是单纯的去了解ValueProvider这一系列的对象模型,因为在没有结合前后知识点串联起来之前,我们都不知道ValueProvider是在哪执行的。所以我们还是老老实实了解一下ValueProvider相关的对象吧。
Model-ValueProvider
图1

IValueProvider接口类型--ValueProvider行为约束
首先我们看一下图1中右边的部分,起头的就是一个IValueProvider接口类型,我们就来看一下接口的定义:
示例代码1-1
   publicinterfaceIValueProvider
   {
        boolContainsPrefix(stringprefix);
        ValueProviderResultGetValue(stringkey);
   }我们在代码1-1中看到,IValueProvider接口中定义了两个方法,一个是ContainsPrefix()方法,接收string类型的参数并且返回的是bool值类型,这个方法表示的就是根据指定的前缀值查看当前的ValueProvider中是否存在这个前缀值,这个下面会有示例稍后再说,然后就是GetValue()方法,是根据执行的键值返回当中的对应的值,从这里一看我们就大概能猜到这个ValueProvider应该是类似于键值队一样的类型,而返回的结果被封装在了ValueProviderResult类型当中,这个类型稍后会有说明。在IValueProvider接口约束好ValueProvider值提供程序的行为后,我们应该就来看一看ValueProvider值提供程序的基础结构了。不过呢在此之前我们还是要根据图1中所示的那样,先来看一下IEnumerableValueProvider接口类型的定义,这个接口主要负责什么呢?
IEnumerableValueProvider接口类型-ValueProvider行为约束
示例代码1-2
   publicinterfaceIEnumerableValueProvider : IValueProvider
   {
        IDictionaryGetKeysFromPrefix(stringprefix);
   } 从代码1-2中可以很清楚明了的看到IEnumerableValueProvider接口类型的职责很简单,就是对指定的前缀值进行检索,并且最后以键值队的形式返回,这个在下面会有示例详细说明。
NameValuePairsValueProvider类型-ValueProvider基础结构
示例代码1-3
   publicclassNameValuePairsValueProvider : IEnumerableValueProvider, IValueProvider
   {
        publicNameValuePairsValueProvider(Func>>valuesFactory, CultureInfoculture);
        publicNameValuePairsValueProvider(IEnumerable>values, CultureInfoculture);
 
        publicvirtualboolContainsPrefix(stringprefix);
        publicvirtualIDictionaryGetKeysFromPrefix(stringprefix);
        publicvirtualValueProviderResultGetValue(stringkey);
    }   在代码1-3中我们看到NameValuePairsValueProvider类型的定义,首先就说说它的构造函数吧,两个构造函数的区别在于第一个是Func
对于KeyValuePair
至于剩下的三个方法我们还是靠简单的示例来说明一下。
示例代码1-4
    publicclassValueProviderCaseController : ApiController
   {
        publicstringGet()
        {
            
            KeyValuePair[] dictionary=newKeyValuePair[]
            {
                newKeyValuePair("EmployeesInfo.Name","Jinyuan"),
                newKeyValuePair("EmployeesInfo.Age","24"),
                newKeyValuePair("EmployeesInfo.Sex","男"),
                newKeyValuePair("EmployeesInfo.AddressInfo.AddressInfo","南京市"),
                newKeyValuePair("EmployeesInfo.AddressInfo.ZipCode","210000")
            };
            NameValuePairsValueProvidernameValuePairsValueProvider=newNameValuePairsValueProvider(dictionary,null);
            StringBuilderstrBuilder=newStringBuilder();
            NameValuePairsPrefixAnalysis(strBuilder, nameValuePairsValueProvider, "EmployeesInfo");
            returnstrBuilder.ToString();
        }
 
        privatevoidNameValuePairsPrefixAnalysis(StringBuilderstringbuilder, NameValuePairsValueProvidernamevaluepairs,stringprefix)
        {
            IDictionarydictionarys=namevaluepairs.GetKeysFromPrefix(prefix);
            
            if (dictionarys.Count>0)
            {
                Console.WriteLine(prefix+"为前缀的数据源Key值检索……");
                foreach (varitemindictionarys)
                {
                    Console.WriteLine("Key:"+item.Key+" Value:"+item.Value);
                }
                foreach (KeyValuePairkeyvalueindictionarys)
                {
                    NameValuePairsPrefixAnalysis(stringbuilder, namevaluepairs, keyvalue.Value);
                }
            }
            else
            {
                stringbuilder.AppendLine(prefix+":"+namevaluepairs.GetValue(prefix).RawValue.ToString());
            }
        }
   }         我们来看代码1-4,首先我在Get()方法中定义了一个KeyValuePair
表1
| Key | Value | 
| EmployeesInfo.Name | Jinyuan | 
| EmployeesInfo.Age | 24 | 
| EmployeesInfo.Sex | 男 | 
| EmployeesInfo.AddressInfo.AddressInfo | 南京市 | 
| EmployeesInfo.AddressInfo.ZipCode | 210000 | 
表1所表示的就是初始数据源,也就是我们定义的KeyValuePair
然而在我们使用NameValuePairsValueProvider类型的实例已” EmployeesInfo”作为前缀调用了GetKeysFromPrefix()方法后返回的IDictionary
表2
| Key | Value | 
| Name | EmployeesInfo.Name | 
| Age | EmployeesInfo.Age | 
| Sex | EmployeesInfo.Sex | 
| AddressInfo | EmployeesInfo.AddressInfo | 
这里的表2值只是第一层的关系值。
在此之后我们输出的当前的所要检索的前缀值以及检索过后的值,并且会遍历表2里的Value值作为前缀值再次的对数据源进行前缀检索,如果没有了则说明已经没有可检索的了。
并且使用NameValuePairsValueProvider类型实例调用的GetValue()方法根据最后已经检索不出来有后缀的前缀值,也就是原始数据源当中的Key值了。
最后我们看一下结果。
图2

在客户端我们获取到了值,当然这里只是演示示例,值提供程序提供的值方向反了。
然后我们可以在服务端看到检索的记录,可以明确的看到有两层的结构在其中。有兴趣的朋友深入一下看下检索的具体实现方式。
QueryStringValueProvider类型-ValueProvider特定结构
示例代码1-5
   publicclassQueryStringValueProvider : NameValuePairsValueProvider
   {
        publicQueryStringValueProvider(HttpActionContextactionContext, CultureInfoculture)
            : base(func, culture)
        {
            Func>>func=null;
            if (func==null)
            {
                func= () =>actionContext.ControllerContext.Request.GetQueryNameValuePairs();
            }
        }
   } 从代码1-5中可以看到在QueryStringValueProvider类型初始化的时候构造函数中的执行,把从请求查询字符串作为原始数据来源封装为委托类型,然后调用基类的构造函数。
RouteDataValueProvider类型-ValueProvider特定结构
示例代码1-6
   publiccla***outeDataValueProvider : NameValuePairsValueProvider
   {
        publicRouteDataValueProvider(HttpActionContextactionContext, CultureInfoculture)
            : base(func, culture)
        {
            Func>>func=null;
            if (func==null)
            {
                func= () =>GetRoutes(actionContext.ControllerContext.RouteData);
            }
        }
   } 同上面1-5一样的道理,这里使用了HttpRouteData中的Values值作为原始数据源。
还有图1中的左边部分会在后面的篇幅中讲解,在这里讲不适合,会感觉不连贯,虽然看完本篇不知道这个起到了什么作用也不知道怎么去使用,感觉被掐住了脖子一样的难受,但是后面我会把前面所讲的内容全部串联起来做一个演示,所示这是基础部分的知识,就是一个铺垫。
当前标题:ASP.NETWebAPIModel-ValueProvider
URL网址:http://www.cqwzjz.cn/article/peipip.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 