1: public abstract class ReflectionModelBinder : DefaultModelBinder
2: {
3: private IModelBinderValidator _validator = null;
4: public ReflectionModelBinder() { }
5: public ReflectionModelBinder(IModelBinderValidator validator)
6: {
7: _validator = validator;
8: }
9: protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
10: {
11: ParameterInfo[] parameters = GetParameters();
12: List<object> paramValues = new List<object>();
13: IModelBinder binder;
14: string oldModelName = bindingContext.ModelName;
15: foreach (ParameterInfo param in parameters)
16: {
17: string name = CreateSubPropertyName(oldModelName, param.Name);
18: bindingContext.ModelType = param.ParameterType;
19: bindingContext.ModelName = name;
20: if (!System.Web.Mvc.ModelBinders.Binders.TryGetValue(param.ParameterType, out binder))
21: binder = System.Web.Mvc.ModelBinders.Binders.DefaultBinder;
22: object model = binder.BindModel(controllerContext, bindingContext);
23: paramValues.Add(model);
24: }
25: bindingContext.ModelType = modelType;
26: bindingContext.ModelName = oldModelName;
27: object obj = CreateModel(paramValues.ToArray());
28:
29: if (_validator != null)
30: _validator.Validate(bindingContext, obj);
31:
32: return obj;
33: }
34: protected abstract ParameterInfo[] GetParameters();
35: protected abstract object CreateModel(object[] parameters);
36: }