ASP.Net MVC ModelBindingContext类 - 它的模型值是如何填充的?
我在模仿粘合剂如何在ASP.Net MVC中做他们的工作,我有点挠头。ASP.Net MVC ModelBindingContext类 - 它的模型值是如何填充的?
具体来说,BindModel()方法有一个ModelBindingContext参数来保存模型名称和类型,但我不明白ModelBindingContext如何接收这些值。
必须从发布的表单值或查询字符串参数或其他数据源填充MVC模型。但是什么机制决定了交给ModelBindingContext的模型类型,以及如何在另一个模型类型上选择一个模型类型,甚至包括包含单个发布值的简单列表?
在我看来,ModelBindingContext“知道”它正在交给的模型的类型,我不确定它来自哪里或涉及到填充它的工作流。
有趣的问题。这里简单介绍一下MVC的功能。它全部由ControllerActionInovker类处理。这不是特定的顺序,但很接近。
- ControllerActionInovker通过反射确定参数类型。
- Next ValueProviders是从HttpContext请求表单,Route,QueryString等属性创建的。你也可以提供你自己的价值提供者。
- 这些ValueProviders通过充当虚拟ValueProvider的集合提供给ModelBindingContext。
- 然后ControllerActionInovker查找特定类型的ModelBinder。如果它找不到一个,它默认为内置的DefaultModelBinder。
- 在大多数情况下,使用DefaultModelBinder。它的任务是创建一个模型,并使用ValueProviders将属性与值相关联,并使用模型属性名称作为关键字。当ValueProviders有一个值时,它们返回一个负责类型转换的ValueProviderResult对象。
你可以在ASP.net MVC source located at codeplex.com中看到自己。查找ControllerActionInvoker类和GetParameterValue方法。
感谢您的总结 – larryq 2010-08-24 22:27:10
的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) { ... }
-
查询的ModelBindingContext.ModelType等于模型例如
if (bindingContext.ModelType == typeof(Contact)) { ... }
-
补充水分从ModelBindingContext.ValueProvider属性模型来检索,从形式帖子,路线数据表示数据ValueProviderResult情况下,查询字符串如
bindingContext.ValueProvider["Name"].AttemptedValue;
下列书籍使用 ASP.NET MVC 2的动作和 ASP.NET MVC 1.0快速
谢谢。我仍然对什么代码需要读取发布的表单信息感到困惑,决定它是一个Contact,然后将它传递给ContactBuinder类中的ModelBindingContext对象。 – larryq 2010-08-19 19:58:36
我看到它的方式是,ControllerActionInvoker使用反射来获取参数类型,然后检查是否分配了任何ModelBinder来处理该类型,如果是这样的话,它实例化此ModelBinder并将BindingContext传递给它,模型对象,模型名称,模型类型,属性过滤器)以及所有其他值提供程序(Form,Query String等)的值提供程序集合(ModelBindingContext.ValueProvider),充当一个大型虚拟值提供程序。 (ModelBindingContext.ValueProvider)中的所有值提供程序都会递归地运行它自己,并在这些值提供程序中查找属性名称,从而绑定这些属性名称值(来自客户端的名称)匹配类型属性名称的值,当它们与值提供程序匹配时返回一个ValueProviderResult对象,并带有模型上各个属性的名称和值。
jeez,对不起,我标记为关闭错误的问题 – jfar 2010-08-19 16:30:54