http://www.cnblogs.com/mszhangxuefei/archive/2012/05/15/mvcnotes_30.html
使用默认的Model Binder(Using the Default Model Binder)
尽管一个应用程序有多个binders,大多数都是依赖于内置的binder类——DefaultModelBinder。这也是当action调用者找不到自定义的binder时使用的binder。默认情况下,这个model binder搜索了4个路径,如下所示: Request.Form:HTML表单提供的值 RouteData.Values:使用应用程序路由获取的值 Request.QueryString:包含在URL的请求字符串里面的数据 Request.Files:作为请求部分被上传的文件
上面四个路径是按顺序搜索的,例如在上面的例子中,action方法需要一个参数id,DefaultModelBinder会检查action方法并寻找名为id的参数。它会按下面的顺序来寻找: 1. Request.Form["id"] 2. RouteData.Values["id"] 3. Request.QueryString["id"] 4. Request.Files["id"] 只要有一个值找到,搜索就会停止。
绑定简单类型(Binding to Simple Types)
当处理简单的参数类型时,DefaultModelBinder会试图使用System.ComponentModel.TypeDescriptor类将request数据(字符串型)转换为对应action方法参数的类型。如果这个值不能转换,那么DefaultModelBinder将不能够绑定到model。如果要避免这个问题,可以修改下参数,如:public ViewResult RegisterPerson(int? id) {...},这样修改以后,如果不能匹配,参数的值会为null。还可以提供一个默认值如:public ViewResult RegisterPerson(int id = 23) {...}
绑定复杂类型(Binding to Complex Types)
如果action方法参数是一个复杂类型(就是不能使用TypeConverter转换的类型),那么DefaultModelBinder会使用反射获取公共的属性并轮流绑定每一个属性。使用前面的Person.cs来举例,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class Person { [HiddenInput(DisplayValue=false)] public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [DataType(DataType.Date)] public DateTime BirthDate { get; set; } public Address HomeAddress { get; set; } public bool IsApproved { get; set; } public Role Role { get; set; } } public class Address { public string Line1 { get; set; } public string Line2 { get; set; } public string City { get; set; } public string PostalCode { get; set; } public string Country { get; set; } }
默认的model binder会检查这个类的属性是否都是简单类型,如果是,binder就会在请求里面具有相同的名称的数据项。对应例子来说就是FirstName属性会引起binder寻找一个名为FirstName的数据项。如果这个类的属性(如Address)仍然是个复杂类型,那么对这个类型重复上面的处理过程。在寻找Line1属性的值时,model binder会寻找HomeAddress.Line1的值。