首页 > 代码库 > MVC如何绑定复杂类型的页面Model

MVC如何绑定复杂类型的页面Model

  页面绑定简单类型的model时,可以在控制器里直接拿到页面绑定的model中post回来的值,但是如果一个model是复杂类型,比如model中有另一个自定义对象,这样的model就无法在控制器里面直接获取到值了。

  这时候就只能按层次的获取每个层次的值,具体如何实现代码如下:

 public class SimpleModelBinder:IModelBinder    {        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)        {            object model = this.GetModel(controllerContext, bindingContext.ModelType, bindingContext.ValueProvider, bindingContext.ModelName);            if (bindingContext.FallbackToEmptyPrefix && null == model)            {                model = this.GetModel(controllerContext, bindingContext.ModelType, bindingContext.ValueProvider, "");            }            return model;        }        public object GetComplexModel(ControllerContext controllerContex,Type modelType,IValueProvider valueProvider,string prefix)        {            object oModel = CreateModel(modelType);            PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(modelType);            foreach (PropertyDescriptor pd in pdc)            {                if (pd.IsReadOnly)                {                    continue;                }                string key = string.IsNullOrEmpty(prefix) ? pd.Name : prefix + "." + pd.Name;                               pd.SetValue(oModel,GetModel(controllerContex,pd.PropertyType,valueProvider,key));            }            return oModel;        }        public virtual object GetModel(ControllerContext controllerContext,Type modelType,IValueProvider valueProvider,string key) {            if (!valueProvider.ContainsPrefix(key))            {                return null;            }            ModelMetadata modelMeatadata = ModelMetadataProviders.Current.GetMetadataForType(null, modelType);            if (!modelMeatadata.IsComplexType)            {                return valueProvider.GetValue(key).ConvertTo(modelType);            }            if(modelMeatadata.IsComplexType)            {                return GetComplexModel(controllerContext, modelType, valueProvider, key);            }            return null;        }               private object CreateModel(Type modelType)        {            Type type = modelType;            if (modelType.IsGenericType)            {                Type genericTypeDefinition = modelType.GetGenericTypeDefinition();                if (genericTypeDefinition == typeof(IDictionary<,>))                {                    type = typeof(Dictionary<,>).MakeGenericType(modelType.GetGenericArguments());                }                else if (((genericTypeDefinition == typeof(IEnumerable<>)) || (genericTypeDefinition == typeof(ICollection<>))) || (genericTypeDefinition == typeof(IList<>)))                {                    type = typeof(List<>).MakeGenericType(                     modelType.GetGenericArguments());                }            }            return Activator.CreateInstance(type);        }    }

 然后

 [ModelBinder(typeof(SimpleModelBinder))]    public class RoleModel    {        public string RoleName { set; get; }        public string RoleDescription { set; get; }        public string RoleExistId { set; get; }        public UserMangerModle userManagerModel { set; get; }......}
就可以通过遍历各层属性就行复杂类型值的获取了。。。

MVC如何绑定复杂类型的页面Model