2010-08-19 34 views
8

我在模仿粘合剂如何在ASP.Net MVC中做他们的工作,我有点挠头。ASP.Net MVC ModelBindingContext类 - 它的模型值是如何填充的?

具体来说,BindModel()方法有一个ModelBindingContext参数来保存模型名称和类型,但我不明白ModelBindingContext如何接收这些值。

必须从发布的表单值或查询字符串参数或其他数据源填充MVC模型。但是什么机制决定了交给ModelBindingContext的模型类型,以及如何在另一个模型类型上选择一个模型类型,甚至包括包含单个发布值的简单列表?

在我看来,ModelBindingContext“知道”它正在交给的模型的类型,我不确定它来自哪里或涉及到填充它的工作流。

+0

jeez,对不起,我标记为关闭错误的问题 – jfar 2010-08-19 16:30:54

回答

12

有趣的问题。这里简单介绍一下MVC的功能。它全部由ControllerActionInovker类处理。这不是特定的顺序,但很接近。

  1. ControllerActionInovker通过反射确定参数类型。
  2. Next ValueProviders是从HttpContext请求表单,Route,QueryString等属性创建的。你也可以提供你自己的价值提供者。
  3. 这些ValueProviders通过充当虚拟ValueProvider的集合提供给ModelBindingContext。
  4. 然后ControllerActionInovker查找特定类型的ModelBinder。如果它找不到一个,它默认为内置的DefaultModelBinder。
  5. 在大多数情况下,使用DefaultModelBinder。它的任务是创建一个模型,并使用ValueProviders将属性与值相关联,并使用模型属性名称作为关键字。当ValueProviders有一个值时,它们返回一个负责类型转换的ValueProviderResult对象。

你可以在ASP.net MVC source located at codeplex.com中看到自己。查找ControllerActionInvoker类和GetParameterValue方法。

+0

感谢您的总结 – larryq 2010-08-24 22:27:10

3

的ModelBindingContext“知道”模型的类型它是手,因为你必须要么:

  • 一个ModelBinder的属性添加到您的模型
  • 使用的ModelBinders模型注册ModelBinder的。 Binders.Add()方法。 ModelBinder的属性

例子:

[ModelBinder(typeof(ContactBinder))] 
public class Contact { ... } 

ModelBinders.Binders.Add()的例子:

void Application_Start() 
{ 
    ModelBinders.Binders[typeof(Contact)] = new ContactBinder(); 
} 

如果您已经注册ModelBinder的和已实施BindModel方法:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ... } 
  1. 查询的ModelBindingContext.ModelType等于模型例如

    if (bindingContext.ModelType == typeof(Contact)) { ... } 
    
  2. 补充水分从ModelBindingContext.ValueProvider属性模型来检索,从形式帖子,路线数据表示数据ValueProviderResult情况下,查询字符串如

    bindingContext.ValueProvider["Name"].AttemptedValue; 
    

下列书籍使用 ASP.NET MVC 2的动作ASP.NET MVC 1.0快速

+0

谢谢。我仍然对什么代码需要读取发布的表单信息感到困惑,决定它是一个Contact,然后将它传递给ContactBuinder类中的ModelBindingContext对象。 – larryq 2010-08-19 19:58:36

1

我看到它的方式是,ControllerActionInvoker使用反射来获取参数类型,然后检查是否分配了任何ModelBinder来处理该类型,如果是这样的话,它实例化此ModelBinder并将BindingContext传递给它,模型对象,模型名称,模型类型,属性过滤器)以及所有其他值提供程序(Form,Query String等)的值提供程序集合(ModelBindingContext.ValueProvider),充当一个大型虚拟值提供程序。 (ModelBindingContext.ValueProvider)中的所有值提供程序都会递归地运行它自己,并在这些值提供程序中查找属性名称,从而绑定这些属性名称值(来自客户端的名称)匹配类型属性名称的值,当它们与值提供程序匹配时返回一个ValueProviderResult对象,并带有模型上各个属性的名称和值。