ASP.Net MVC:价值提供者和模型粘合剂之间的区别是什么

时间:2016-03-04 14:38:39

标签: asp.net-mvc

我正在读一篇关于Value Provider and Model Binder

之间区别的内容

据我所知,Model Binder基本上可以获取传入数据和构建对象。假设我正在发送学生数据,然后模型绑定器从发布到服务器时抓取传入的学生数据并构建学生对象。

但仍然不明白MVC中Value Provider的工作是什么。

那么请用简单的样本解释Value Provider做什么样的工作以及什么型号的粘合剂呢?

目前尚不清楚haacked.com在说什么

  

DefaultModelBinder将从RouteData中提取Id值   构建时JSON中的Age,FirstName和LastName值   Person对象。之后,它将执行验证,而不是   要知道各种价值来自不同的来源。

当我发布id,名称,年龄等时,为什么模型绑定器将仅从路径数据和JSON的其余数据中选择id。 model binder应该从RouteData中选择所有值,或者从JSON中选择所有值..............所以为什么只能id?

mvc中存在多少种不同类型的价值提供者?

3 个答案:

答案 0 :(得分:3)

ValueProviders 用于从请求中的不同来源获取数据

ModelBinders 从ValueProviders获取数据以创建对象。他们不是直接从Route Data,JSON或某些特定的,它不是他们的责任。

  • ASP.Net MVC 5中可用的ValueProviders列表,按优先级顺序排列:

    1. ChildActionValueProviderFactory
    2. FormValueProviderFactory
    3. JsonValueProviderFactory
    4. RouteDataValueProviderFactory
    5. QueryStringValueProviderFactory
    6. HttpFileCollectionValueProviderFactor
  • ASP.Net Web API中可用的ValueProviders列表,按优先级顺序:

    1. QueryStringValueProviderFactory
    2. RouteDataValueProviderFactory

参考:Brad Wilson,专业ASP.Net MVC 5,Wrox版

多个ValueProviders可以合作从不同来源获取数据。

如果多次提供数据,则优先级很重要。

e.g。 :id来自querystring和RouteData - RouteData胜过querystring

一切顺利

答案 1 :(得分:1)

我可能来不及回答,但我希望这对社区有用。

与链接有关的第一点:Value Provider and Model Binder.

  1. ValueProvider:mvc中的ValueProvider类似于解析的字典源,可帮助modelbinder为其模型获取适当的值。如果你看一下界面IValueProvider,它有两个方法。 ContainPrefix和GetValue。 ContainPrefix可帮助您识别子模型。例如Person Model内部客户。像那样。

    • 如果查看DefaultModelBinder,如果在Query字符串或Form或RouteData中指定,它将获取绑定值。在幕后,ValueProvider得到了帮助。 ModelBinder它自己不知道。 ValueProvider在ModelBinder下面一层。
  2. 有许多类型的ValueProvider是MVC。即使您可以构建自己的值提供程序并在Global.asax中注册MVC Framework。

    在Global.asax的Application_Start中

     protected void Application_Start()
        {
            // Other default configuration
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            var valueProviders = ValueProviderFactories.Factories;     // To Get List of ValueProviders. This list order is also important.       
        }
    
  3. 如果你看一下Peoson json对象的实际链接它没有Id值,所以它将取值RouteData。如果您的Person json对象包含Id值,则有两个Id Value源。现在,无论哪个价值提供者首先获得优先权。 (ValueProvider列表)。如果JsonValueProvider首先出现,那么它将获取优先级绑定Id值,如果RouteDataValueProvider首先出现,那么它将获得优先级绑定Id值。

    要看到这一点,您可以在global.asax application_start中尝试这样做。 (在我的列表中,JsonValueProvider首先出现,所以我将其删除并在最后添加)

    protected void Application_Start()
    {
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    var valueProviders = ValueProviderFactories.Factories;
    ValueProviderFactories.Factories.RemoveAt(2); // My JsonValueProvider was at index 2.
    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
    }
    

答案 2 :(得分:0)

模型绑定器(例如,与绑定到复杂类型的绑定器)有责任遍历类型图(即递归查找可绑定属性)并尝试查找这些属性的值。绑定器从值提供程序获取这些值。

想象一下,如果你要编写自己的模型绑定器,类似于复杂类型绑定器。这是非平凡的代码。因此,应该仔细决定是否要编写值提供程序或模型绑定程序。您可能会想到"如果我创建了一个valueprovider,那么我将获得免费的所有属性的递归绑定"。