zoukankan      html  css  js  c++  java
  • 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参数中。

  • 相关阅读:
    linux安装mysql5.7.24
    如何解决svn Authorization failed错误
    vux配置i18n
    vue项目使用vux框架配置教程
    EL函数
    Android的taskAffinity对四种launchMode的影响
    Activity生命周期-Android
    为什么用服务不用线程-Android
    Hibernate总结--MyEclipse的小bug
    EL表达式隐含对象
  • 原文地址:https://www.cnblogs.com/LiangSW/p/5919481.html
Copyright © 2011-2022 走看看