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; }
......
}
就可以通过遍历各层属性就行复杂类型值的获取了。。。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。