MVC5-7 ValueProvider

本文详细介绍了ASP.NET MVC框架中如何通过ValueProvider机制优雅地处理HTTP请求参数。无论GET还是POST请求,都能轻松获取并绑定到Action方法的参数中。通过分析ValueProviderFactories静态类及其内部实现的不同ValueProvider,揭示了这一机制背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

统一的数据获取

在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参数中。

转载于:https://www.cnblogs.com/LiangSW/p/5919481.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值