DefaultModelBinder的默认Model绑定机制。 我们通过一个简单的实例来模拟实现在DefaultModelBinder中针对简单类型的Model绑定。 如下所示的是我们自定义的DefaultModelBinder,其属性ValueProvider用于从请求中提供相应的数据值,该属性在构造函数中被初始化。 我们可以看到目标Action方法的两个参数值均通过我们自定义的DefaultModelBinder得到了有效的绑定。 现在我们采用我们完善后的DefaultModelBinder来进行针对复杂类型的Model绑定。
set; } 4: public ControllerActionInvoker() 5: { 6: this.ModelBinder = new DefaultModelBinder modelName, Type modelType); 4: } 通过前面给出的关于ControllerActionInvoker的定义我们可以看到在构造函数中默认创建的ModelBinder对象是一个DefaultModelBinder 由于仅仅是对ASP.NET MVC的模拟,定义在自定义的DefaultModelBinder中的Model绑定逻辑比ASP.NET MVC中同名类型中实现的要简单得多。 1: public class DefaultModelBinder : IModelBinder 2: { 3: public object BindModel(ControllerContext
在本系列的前面两篇文章(《简单类型+复杂类型》、《数组》)我们通过创建的实例程序模拟了ASP.NET MVC默认使用的DefaultModelBinder对简单类型、复杂类型以及数组对象的Model绑定 我们对自定义的DefaultModelBinder作了如下的完善使之支持集合类型的Model绑定。 1: public class DefaultModelBinder 2: { 3: //其他成员 4: public object BindModel(Type parameterType [1].Value.EmailAddress: Bar@gmail.com 9: [1].Value.PhoneNo : 987654321 现在我们对用于模拟默认Model绑定的自定义DefaultModelBinder 1: public class DefaultModelBinder 2: { 3: //其他成员 4: public object BindModel(Type parameterType
1: Public void ActionMethod(string[] foo, HttpPostedFileBase[] bar) 现在我们对用于模拟默认Model绑定的自定义DefaultModelBinder 1: public class DefaultModelBinder 2: { 3: //其他成员 4: public object BindModel(Type 现在我们对用于模拟默认Model绑定的自定义DefaultModelBinder进行进一步完善,使之支持基于索引的数组绑定。 1: public class DefaultModelBinder 2: { 3: //其他成员 4: public object BindModel(Type parameterType 我们现在将自定义的DefaultModelBinder用于进行基于数组的Model绑定,在之前演示实例的基础上我们对Action方法作了如下的修改,使之具有一个Contact数组类型的参数。
IModelBinderProvider用于提供合适的ModelBinder对象,我们可以自己实现该接口以获取自定义的IModelBinder ModelBinding的核心是IModelBinder,默认实现类是DefaultModelBinder ModelBinderProviders.BinderProviers 使用ModelBinders.Binders 参数类型上标记CustomModelBinderAttribute ASP.NET MVC中提供的DefaultModelBinder
在这里默认ModelBinder类型为DefaultModelBinder。 当我们运行该程序的时候,在浏览器上会得到如下的输出结果,应用在类型Bar上的BarModelBinder会用于针对参数bar的Model绑定,而参数baz则会使用默认的DefaultModelBinder 1: foo: FooModelBinder 2: bar: BarModelBinder 3: baz: DefaultModelBinder 对于上面的这个例子,由于数据类型Baz没有关联 ModelBinder注册到通过ModelBinders的静态属性Binders表示的全局ModelBinder列表中,所以才导致DoSomething的baz参数采用默认的DefaultModelBinder
具体来说,Model验证最终是通过默认的ModelBinder,即DefaultModelBinder实现的。 ModelValidator完成的Model验证并不是递归进行的),但是从整个Model绑定过程来看,Model验证却具有递归性,所以Model绑定和Model验证绝对不可能是先后的过程,唯一的可能是DefaultModelBinder 当DefaultModelBinder通过Model得到一个被初始化的Contact对象之后,会根据Contact类型的Model元数据调用ModelValidator的静态方法GetModelValidator DefaultModelBinder就是在递归绑定复杂类型对象的过程中对绑定后的对象实施验证,从而使各个层次上的验证规则得以生效。
public string Comparison { get; set; } } 模型数据绑定解析 public class ExtFilterInfoModelBinder : DefaultModelBinder
最后,介绍默认的Model绑定DefaultModelBinder类,这块内容比较多,但由于是框架默认提供的,了解即可,主要思路如以下代码所示。 1 public class DefaultModelBinder : IModelBinder 2 { 3 public object BindModel(ControllerContext controllerContext Model绑定中的验证解释起来比较拗口,但简单说来就是DefaultModelBinder在递归的绑定复杂对象的过程中对绑定后的对象实施验证,如下图所示。 ? foreach (var result in results) 22 { 23 yield return new ModelValidationResult 24 { 25 MemberName = DefaultModelBinder.CreateSubPropertyName foreach (var result in results) 39 { 40 yield return result; 41 } 42 } 43 } 44 } 45 } 1 public class DefaultModelBinder
模型绑定分为隐式模型绑定(DefaultModelBinder)和显式模型绑定(UpdateModel)。 ASP.NET MVC通过模型绑定(Model Binding)机制来解析客户端传送过来的数据,解析的工作由DefaultModelBinder类进行处理。 简单模型绑定:Action的参数在Action被执行时会通过DefaultModelBinder从form或QueryString传送过来的数据进行处理,即将传送过来的字符串型的数据转换成对应的.Net 复杂模型绑定:在ASP.NET MVC中,可以通过DefaultModelBinder类将form数据对应到复杂的.NET类,即模型。该模型可能是一个List<T>类或一个含有多个属性的自定义类。 从客户端传送过来的form数据会通过DefaultModelBinder类自动创建Product类对象,将form字段通过.NET的Reflection(反射)机制一一对应到对象的同名属性中。
2模型绑定 默认模型绑定器 通过DefaultModelBinder解析客户端传来的数据,为控制器的操作参数列表赋值。
为此我们定义了一个具有如下定义的ParameterValidationModelBinder,它直接继承自DefaultModelBinder,而针对简单类型的Model验证定义在重写的BindModel 1: public class ParameterValidationModelBinder : DefaultModelBinder 2: { 3: public override
System.Linq; using System.Web.Mvc; using Newtonsoft.Json; public class JsonNetModelBinder : DefaultModelBinder
当选择合适的action方法后,model binder(模型绑定器,默认是System.Web.Mvc.DefaultModelBinder)取回传入的Http请求的数据,然后进行数据转换,数据验证(
创建自定义Model Binder 1: public class MyEmployeeModelBinder : DefaultModelBinder 2: { 3: