MVC5-7 ValueProvider

统一的数据获取

在WebForm时代,我们是怎么获取值的呢?

HttpContext.Request.QueryString
HttpContext.Request.Form
HttpContext.Request.Files

当然,也可以直接使用HttpContext.Request[] 的方式统一获取。因为内部把这几种获取方式都走了一遍

而在MVC中我们是如果获取值的呢

在action中我们可以轻松优雅的使用形参接收请求值,无论是Post,Get请求。都可以轻松的获取到值,这是怎么回事呢。

public static class ValueProviderFactories
{
    private static readonly ValueProviderFactoryCollection _factories;
        
    static ValueProviderFactories()
    {
       ValueProviderFactoryCollection factorys = new ValueProviderFactoryCollection();
       factorys.Add(new ChildActionValueProviderFactory());
       factorys.Add(new FormValueProviderFactory());
       factorys.Add(new JsonValueProviderFactory());
       factorys.Add(new RouteDataValueProviderFactory());
       factorys.Add(new QueryStringValueProviderFactory());
       factorys.Add(new HttpFileCollectionValueProviderFactory());
       factorys.Add(new JQueryFormValueProviderFactory());
        _factories = factorys;
     }
        
     public static ValueProviderFactoryCollection Factories =>
        _factories;
}

Mvc中IValueProvider接口对获取数据做了一个统一,接口中有一个GetValue方法。上图的共七个ValueProvider就是及实现类,可以看到熟悉的身影。比如 QueryStringValueProvider,FormValueProvider

  • ChildActionValueProvider  上篇博文写到了子视图(分布视图) Action的传值就是这个ValueProvider获取

  • JsonValueProvider Mvc会把请求过来的参数转化成实体,其实一点也不神奇,就是这个ValueProvider在操作

  • RouteDataValueProviderFactory  获取匹配路由的Provider

  • JQueryFormValueProvider 从名字也可以看出来,使用JQForm组件请求来的参数

值得一提的是这几个ValueProvide其中有继承自DictionaryValueProvider、有的继承NameValueCollectionValueProvider

当一个请求过来的时候,MVC会把这几个ValueProvider都走一遍,如果有值,则返回值,没有值则走下一个ValueProvider,如下图

image

[E]Z0)9H$)93E7}CX`[1BTY

 

ValueProvider这么神奇?我怎么没见过

这么一个牛掰的东西,我们在开发中为什么没有使用过呢 ?  因为它本身就不是为我们手动使用准备的。我们在action中轻松的拿到请求参数得益于defalutModelbinder(模型绑定器) 在这个类中大量的使用到了valueProvider,使请求的数据绑定到我们的action参数中。

posted @ 2016-09-29 12:26  liangshiwei  阅读(685)  评论(0编辑  收藏  举报